Dire che ci sono due classi, che hanno bisogno l'una dell'altra: container e articolo. Il contenitore della classe crea istanze della classe elemento. Ogni istanza di classe elemento contiene un'istanza di classe contenitore e deve solo chiamare il metodo method_called_by_item di classe contenitore. Classe contenitore deve vedere tutti i campi della classe articolo.due classi che fanno riferimento l'un l'altro
Il problema è la dichiarazione in avanti: voglio avere una dichiarazione anticipata all'interno della item.h, in modo che la classe voce può avere un contenitore come campo e chiamare il metodo method_called_by_item. Come lo faccio?
Classe contenitore, che crea elementi.
// 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
L'attuazione:
// 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
}
La classe articolo, che deve chiamare un metodo di contenitore:
// 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
L'attuazione:
// item.cpp
#include "item.h"
item::item(container * c){
this->c = c;
}
void item::do_something(){
this->c->method_called_by_item(this);
}
Ora, come si richiamano i distruttori quando si utilizza shared_ptr ora che queste classi fanno riferimento l'un l'altro? – James
@James dovrai interrompere manualmente il riferimento circolare o usare 'std :: weak_ptr' come appropriato. –
Ovvio Ho provato weak_prt e ho scoperto che non c'era l'operatore -> quindi non sono riuscito ad accedere a nessuna funzione membro. Ma ho capito cosa stava succedendo. Ho fatto qualche ricerca in più e ho scoperto che dovevo in effetti utilizzare i puntatori standard per passare alle funzioni e mantenere i riferimenti alle classi genitore/figlio. Una volta che l'ho fatto, i distruttori hanno iniziato a farsi chiamare. – James