最近遇到一个问题,类的循环引用。就是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; }