Domanda

Così ho un classe A, dove voglio chiamare alcune funzioni di classe B. Così includo "b.h". Ma, in classe B, voglio chiamare una funzione di una classe. Se includo "a.h", finisce in un loop infinito, giusto? Cosa posso fare?

È stato utile?

Soluzione

Ogni classe (A e B) dovrebbe avere un file di intestazione e un file di implementazione.

Ogni file di intestazione (ad esempio A.h) non dovrebbe includere l'altro file di intestazione (ad esempio B.h), ma può includere un riferimento in avanti per l'altra classe (ad esempio una dichiarazione come class B;), e possono quindi utilizzare i puntatori e / o riferimenti al altra classe nella relativa dichiarazione (es class A può contenere un B* come membro di dati e / o come parametro metodo).

Ogni file CPP (ad esempio A.cpp) può includere più di un file di intestazione (ad esempio A.h e B.h). Si raccomanda che ogni file CPP dovrebbe includere il proprio file di intestazione prima (per esempio A.cpp dovrebbe includere A.h e poi B.h, mentre B.cpp dovrebbe includere B.h e poi A.h).

Ogni file di intestazione deve contenere solo la dichiarazione, e non la definizione della classe: ad esempio elencherà le firme dei metodi che la classe, ma non i corpi dei metodi / implementazioni (i corpi dei metodi / implementazioni sarà in file di .cpp, non nel file di intestazione). Poiché i file di intestazione non contengono dettagli L'implementazione, che quindi non dipendono (non hanno bisogno di vedere) i dettagli di altre classi; tutt'al più hanno bisogno di sapere che, per esempio, B è il nome di una classe:., che si può ottenere da un declaratin in avanti, invece che includendo un file di intestazione in un altro file di intestazione

Altri suggerimenti

Mettere solo le dichiarazioni di funzione di membro nel file di intestazione (h), e mettere definizioni di funzioni associate in file di implementazione (cpp). Quindi i file di intestazione non è necessario includere l'un l'altro, ed è possibile includere sia le intestazioni in entrambe le file di implementazione.

Per i casi in cui è necessario fare riferimento all'altra classe di firme membri pure, è possibile utilizzare una dichiarazione anticipata:

class A;

Ciò consente di utilizzare il puntatore e tipi di riferimento (A* e A&), anche se non A sé. Inoltre non consente di chiamare i membri.

Esempio:

// a.h
struct B; // forward declaration

struct A {
   void foo(B* b); // pointers and references to forward-declared classes are ok
};


// b.h
struct A; // forward declaration

struct B {
   void bar(A& a); // pointers and references to forward-declared classes are ok
};


// a.cpp
#include "a.h"
#include "b.h"

void A::foo(B* b) {
   b->bar(*this); // full declaration of B visible, ok to call members now
}


// b.cpp
#include "a.h"
#include "b.h"

void B::bar(A& a) {
   a.foo(this); // full declaration of A visible, ok to call members now
}

È inoltre possibile utilizzare dichiarazioni previsionali per aggirare il problema.

Prova a mettere #ifndef, #define e #endif intorno ai vostri file .h.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top