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);
}
Teraz, w jaki sposób wywołuje się destruktory podczas używania shared_ptr teraz, gdy te klasy się nawzajem odwołują? – James
@James musisz albo ręcznie przerwać odwołanie cykliczne, albo użyć 'std :: weak_ptr'. –
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