2013-05-25 4 views
5

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); 
} 

risposta

3

Hai già aggiunto il forward to item.h quindi tutto ciò che dovete fare è aggiungere la riga seguente a item.cpp.

#include "container.h" 

container.h include già item.h in modo da non hanno di apportare ulteriori modifiche, ma come Mahmoud Fayez rilevare è possibile aggiungere una dichiarazione anticipata anche lì. Ciò rimuoverà la dipendenza dal file di intestazione che è in genere desiderato: può ridurre i tempi di compilazione su progetti di grandi dimensioni e consente al file di intestazione di "stare in piedi da solo".

+0

Ora, come si richiamano i distruttori quando si utilizza shared_ptr ora che queste classi fanno riferimento l'un l'altro? – James

+0

@James dovrai interrompere manualmente il riferimento circolare o usare 'std :: weak_ptr' come appropriato. –

+0

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

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"