2013-05-25 13 views
5

Powiedzmy, że są dwie klasy, które potrzebują się nawzajem: kontener i pozycja. Kontener klasy tworzy wystąpienia klasy element. Każda instancja klasy pozycji posiada instancję klasy pojemnika i musi wywołać tylko metoda method_called_by_item klasy pojemnika. Klasa kontener musi widzieć wszystkie pola klasy pozycja.dwie klasy odnoszące się do siebie

Problemem jest deklaracja naprzód: Chcę mieć z przodu deklarację wewnątrz item.h, tak, że klasa poz może mieć pojemnik jako pola i wywołać metodę method_called_by_item. Jak mogę to zrobić?

Klasa pojemnik, który tworzy elementy.

// 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 

Realizacja:

// 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 
} 

Klasa poz, który musi wywołać jedną z metod pojemnika:

// 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 

Realizacja:

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

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

Odpowiedz

3

Masz już dodano Przekaż deklarację do item.h, więc wszystko, co musisz zrobić, to dodać następujący wiersz do item.cpp.

#include "container.h" 

container.h zawiera już item.h więc nie mieć wprowadzać żadnych dodatkowych zmian, ale jak Mahmoud Fayez wskazał, można dodać do przodu deklarację również tam. Spowoduje to usunięcie zależności od pliku nagłówkowego, który jest zazwyczaj pożądany - może skrócić czasy kompilacji dużych projektów i pozwala, aby plik nagłówkowy "stanął na swoim".

+0

Teraz, w jaki sposób wywołuje się destruktory podczas używania shared_ptr teraz, gdy te klasy się nawzajem odwołują? – James

+0

@James musisz albo ręcznie przerwać odwołanie cykliczne, albo użyć 'std :: weak_ptr'. –

+0

Oczywiście Próbowałem weak_prt i odkryłem, że nie było operatora ->, więc nie byłem w stanie uzyskać dostępu do żadnych funkcji członka. Ale zorientowałem się, co się dzieje. Zrobiłem trochę więcej badań i odkryłem, że w rzeczywistości powinienem używać standardowych wskaźników do przejścia do funkcji i utrzymywania odniesień do klas rodzica/dziecka. Kiedy to zrobiłem, destruktory zaczęły być wywoływane. – James

7

w container.h

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

w container.cpp

#include "item.h" 

w item.h

class container; // do not include container.h 

w item.cpp

#include "container.h" 
Powiązane problemy