2013-05-25 16 views
5

Angenommen, es gibt zwei Klassen, die sich gegenseitig benötigen: Container und Element. Die Klasse Container erstellt Instanzen der Klasse Element. Jede Instanz der Klasse Artikel hält eine Instanz der Klasse Behälter und nur die Methode method_called_by_item der Klasse Container aufrufen muss. Klasse Container muss alle Felder der Klasse Element sehen.zwei Klassen, die sich gegenseitig referenzieren

Das Problem ist die Vorwärts-Erklärung: Ich habe eine Vorwärts-Erklärung innerhalb von item.h haben wollen, so dass die Klasse Artikel einen Behälter als Feld haben kann und rufen Sie die Methode method_called_by_item. Wie mache ich das?

Klasse Container, die Elemente erstellt.

// container.h 
#ifndef CONTAINER_H 
#define CONTAINER_H 

#include "item.h" 

class container{ 

public: 
    item * create_item(); 
    void method_called_by_item(item * i); 
}; 

#endif //CONTAINER_H 

Die Umsetzung:

// container.cpp 
#include "container.h" 

item * container::create_item(){ 
    return new item(this); 
} 

void container::method_called_by_item(item * i){ 
    // do stuff with item 
} 

Die Klasse Artikel, die ein Verfahren zum Container aufrufen muss:

// item.h 
#ifndef ITEM_H 
#define ITEM_H 

#include <iostream> 

class container; 

class item{ 

public: 
    item(container * c); 
    void do_something(); 
    container * c; 
}; 

#endif //ITEM_H 

Die Umsetzung:

// item.cpp 
#include "item.h" 

item::item(container * c){ 
    this->c = c; 
} 
void item::do_something(){ 
    this->c->method_called_by_item(this); 
} 

Antwort

3

Sie haben bereits hinzugefügt die Vorwärts-Deklaration zu item.h so alles, was Sie tun müssen, ist die folgende Zeile zu item.cpp hinzuzufügen.

#include "container.h" 

container.h enthält bereits item.h Sie also nicht haben weitere Änderungen zu machen, aber als Mahmoud Fayez Sie auch eine Vorwärts-Erklärung darauf hingewiesen, hinzufügen können. Dadurch wird die normalerweise gewünschte Abhängigkeit von der Header-Datei entfernt. Dadurch können die Build-Zeiten bei großen Projekten verkürzt und die Header-Datei "eigenständig" ausgeführt werden.

+0

Wie erhalten Sie nun die Destruktoren, die bei der Verwendung von shared_ptr aufgerufen werden, da sich diese Klassen jetzt gegenseitig referenzieren? – James

+0

@James müssen Sie entweder den Zirkelverweis manuell brechen oder 'std :: weak_ptr' verwenden. –

+0

Offensichtlich versuchte ich weak_prt und entdeckte, dass es keinen -> Operator gab, so dass ich auf keine Mitgliedsfunktionen zugreifen konnte. Aber ich habe herausgefunden, was passiert ist. Ich forschte weiter und entdeckte, dass ich tatsächlich Standardzeiger verwenden sollte, um in Funktionen zu übergehen und Verweise auf Eltern/Kind-Klassen beizubehalten. Sobald ich das getan hatte, wurden die Destruktoren angerufen. – James

7

in container.h

class item; // do not include the item.h 

in container.cpp

#include "item.h" 

in item.h

class container; // do not include container.h 

in item.cpp

#include "container.h" 
Verwandte Themen