0

J'ai 2 classes: DataObject et DataElement. DataObject contient des pointeurs vers (seulement) DataElement s, et un DataElement contient des pointeurs vers plusieurs types, parmi lesquels un DataObject.Problème de référence circulaire C++

Ceci etait pas de problème, puisque je n'utilise que des pointeurs vers DataObject s dans DataElement, donc une déclaration avant de DataObject dans l'en-tête de DataElement suffit.

Maintenant, cependant, j'essaie d'ajouter un destructeur à DataElement, dans lequel j'ai besoin d'une suppression sur un DataObject. Sur ce le compilateur dit:

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. 

Comment puis-je résoudre ce problème? Une déclaration avant n'est apparemment pas suffisante, alors que je ne peux pas inclure l'en-tête complet pour DataObject, car cela me donne une dépendance circulaire à nouveau.

Merci d'avance!

+2

l'aide d'un pointeur Tenir compte intelligent comme 'shared_ptr' /' weak_ptr', 'scoped_ptr' ou' unique_ptr' (si elle prend en charge l'implémentation); Celles-ci rendent la gestion des ressources en C++ beaucoup plus facile et vous aident à vous assurer que le code est une exception sûre et correcte. –

Répondre

5

Définissez le destructeur dans un fichier .cpp qui inclut les deux en-têtes.

+0

Merci, je vais le faire. (maintenant je connais la solution c'est tellement évident, mais c'est toujours après :) :) – openbas2

2

Définissez le destructeur pour la première classe définie en dehors du corps de classe et après la seconde classe, par ex.

class DataElement; 

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

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

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

Merci! Je vais opter pour la solution de James McNellis car c'est plus facile à faire maintenant, mais cela semble aussi une bonne solution. – openbas2