更具体地说:
class B;
class A
{
public:
A(B &b) : _b(b) { }
~A() { _b.do_something(); }
private:
B &_b;
};
class B
{
public:
B() { }
/** other methods */
~B()
{
for (std::list<A*>::iterator it = _bees.begin(); it != _bees.end(); ++it) {
delete *it;
}
}
void do_something();
private:
std::list<A*> _bees;
};
这样做可以吗?
您在 A::~A ()
中引用了 b
而不是 _b
,后者将无法编译。假设您的意思是 _b
,那么答案是 - 这取决于。它取决于 A
引用的类 B
对象的生命周期。如果 B
类的对象在 A
类的析构函数被调用之前被销毁,那么它是不可行的,否则是可行的。在任何一种情况下,这段代码都不是很简单,许多人会考虑重新设计以降低它的危险性。
如果不能保证 A
被销毁时 B
仍然存在,那么您需要重新设计一下。例如,您可以按值存储 B
(复制它),或者使用引用计数或其他“智能”指针。
我是一名优秀的程序员,十分优秀!