【C++填坑】类的循环引用

  最近遇到一个问题,类的循环引用。就是class A定义了class B的对象,class B中也定义了class A的对象。

  错误的构造方式:采用直接new的方式,就会产生死循环的问题

//A.h
class B;
class A
{
public:
    A();
    ~A();
private:
    B* b;
};

//A.cpp
#include "A.h"
#include "B.h"

A::A()
{
    b = new B();
}

A::~A()
{
    delete b;
    b = nullptr;
}
//B.h
class A;
class B
{
public:
    B();
    ~B();
private:
    A* a;
};

//B.cpp
#include "B.h"
#include "A.h"

B::B()
{
    a = new A();
}

B::~B()
{
    delete a;
    a = nullptr;
}

  讲真的,这样子写一看就知道有问题。但麻烦的是你还不知道怎么去改它。

  下面来说说,这个问题如何优雅的解决。

  正确的构造方式:使用类似于注册的方式去构造

//A.h
class B;
class A
{
public:
    A();
    ~A();
private:
    B * b;
}; 

//A.cpp
#include "a.h"
#include "b.h"

A::A()
{
    b = new B;
    b->setA(this);//划重点,类似于注册的方式去构造类B里的a
}

A::~A()
{
    delete b;
    b = nullptr;
}
//B.h
class A;
class B
{
public:
    B();//划重点,并不需要实现
    ~B();
    void setA(A * x);
private:
    A * a;
};

//B.cpp
#include "b.h"
#include "a.h"

void B::setA(A * x) 
{ 
    a = x;
}

猜你喜欢

转载自www.cnblogs.com/LampsAsarum/p/12100816.html