我有两个课程:DataObject
和DataElement
。 DataObject
包含指向(仅)DataElement
的指针,DataElement
包含指向多种类型的指针,其中包含DataObject
。
这曾经没有问题,因为我只使用DataObject
中DataElement
的指针,因此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
的完整标题,因为这再次给我一个循环依赖。
提前致谢!
答案 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;
}