0

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

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

Заранее благодарен!

+2

Рассмотрите возможность использования смарт-указатель, как 'shared_ptr' /' weak_ptr', 'scoped_ptr' или' unique_ptr' (если реализация его поддерживает); они значительно упрощают управление ресурсами на C++ и помогают вам обеспечить безопасность и правильность кода. –

ответ

5

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

+0

Спасибо, я сделаю это. (теперь я знаю, что решение его ооо очевидно, но это всегда после этого :)) – openbas2

2

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

class DataElement; 

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

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

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

Спасибо! Я поеду за решением Джеймса Макнеллиса, потому что сейчас это проще сделать, но это тоже хорошее решение. – openbas2

Смежные вопросы