Проблема циклических ссылок C ++ - PullRequest
0 голосов
/ 25 октября 2010

У меня есть 2 класса: DataObject и DataElement. DataObject содержит указатели на (только) DataElement с, а DataElement содержит указатели на несколько типов, среди которых DataObject.

Раньше проблем не возникало, поскольку я использую указатели на DataObject s в 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, поскольку это снова дает мне циклическую зависимость.

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 25 октября 2010

Определите деструктор в файле .cpp, который включает оба заголовка.

2 голосов
/ 25 октября 2010

Создайте деструктор для первого класса, определенного вне тела класса и после второго класса, например,

class DataElement;

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

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

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