0

私には2つのクラスがあります:DataObjectDataElement。s DataObject(のみ)へのポインタを保持し、aにはいくつかのタイプへのポインタが含まれます。DataElementDataElementDataObject

DataObject以前は、のsへのポインタのみを使用しているため、これは問題ありませんでした。したがって、のヘッダーでのDataElement前方宣言で十分です。DataObjectDataElement

ただし、ここで、にデストラクタを追加しようとしています。ここでは、を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。これにより、循環依存が再び発生します。

前もって感謝します!

4

2 に答える 2

5

両方のヘッダーを含む.cppファイルでデストラクタを定義します。

于 2010-10-25T16:04:28.693 に答える
2

クラス本体の外部で、2番目のクラスの後に定義された最初のクラスのデストラクタを作成します。

class DataElement;

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

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

DataObject::~DataObject()
{
    delete elem;
}
于 2010-10-25T16:15:56.900 に答える