C ++循环引用问题

时间:2010-10-25 16:02:37

标签: c++ class-design destructor circular-dependency forward-declaration

我有两个课程:DataObjectDataElementDataObject包含指向(仅)DataElement的指针,DataElement包含指向多种类型的指针,其中包含DataObject

这曾经没有问题,因为我只使用DataObjectDataElement的指针,因此DataObject标题中DataElement的前向声明就足够了

但是,现在,我尝试向DataElement添加析构函数,我需要在DataObject上删除。在这方面,编译器说:

dataelement/destructor.cc: In destructor ‘DataElement::~DataElement()’:
dataelement/destructor.cc:8: warning: possible problem detected in invocation of delete operator:
dataelement/destructor.cc:8: warning: invalid use of incomplete type ‘struct DataObject’
dataelement/dataelement.h:7: warning: forward declaration of ‘struct DataObject’
dataelement/destructor.cc:8: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.

我该如何解决这个问题?前向声明显然是不够的,而我不能包含DataObject的完整标题,因为这再次给我一个循环依赖。

提前致谢!

2 个答案:

答案 0 :(得分:5)

在包含两个标题的.cpp文件中定义析构函数。

答案 1 :(得分:2)

为类体外部和第二个类之后定义的第一个类构造析构函数,例如

class DataElement;

class DataObject
{
    DataElement* elem;
public:
    ~DataObject();
};

class DataElement
{
    DataObject* obj;
public:
    ~DataElement() { delete obj; }
};

DataObject::~DataObject()
{
    delete elem;
}