2009-09-15 15 views
18

Sono curioso di uno scenario impostato come il seguente esempio:riferimenti incrociati incluse intestazioni in C++ programma

Ecco il codice che sarebbe stato posto in un file chiamato Header1.h:

#ifndef HEADER1_H 
#define HEADER1_H 

#include "Header2.h" 

class Class1 
{ 
Class2 class2Instance; 
}; 

#endif 

Qui è il codice che sarebbe stato posto in un file chiamato Header2.h:

#ifndef HEADER2_H 
#define HEADER2_H 

#include "Header1.h" 

class Class2 
{ 
Class1 class1Instance; 
}; 

#endif 

ricevo messaggi di errore quando faccio questo (a causa del include presumo), ma ci si sente come avrei bisogno di fare questo al fine a includere ciascuno degli oggetti nelle classi separate. Qualcuno può aiutarmi a realizzare questo, cosa sto sbagliando?

risposta

28

Il problema è che la dimensione di Class1 dipende da Class2 e viceversa. Pertanto, non c'è modo di calcolare la dimensione per nessuno dei due. Forward-dichiara una delle classi, e modificare uno degli attributi per essere un puntatore o riferimento:

#ifndef HEADER2_H 
#define HEADER2_H 

class Class1; 
class Class2 
{ 
Class1 *class1Instance; 
// or 
Class1 &class1Instance; 
}; 

#endif 
+0

Questa è una grande risposta, ma si risolve solo la metà del mio problema. Sto ancora posizionando queste due classi in due intestazioni separate. Ottengo un errore solo per le istruzioni di inclusione mentre le digito, senza l'inclusione circolare della classe. Sai come aggirare questo problema senza metterli nella stessa intestazione. – banDedo

+0

Che errore stai ricevendo? Il codice che hai postato non ha alcun problema con le direttive include. –

+0

Allora forse dovresti darci un esempio rivisto che rifletta il tuo codice attuale e anche dirci esattamente quali errori stai ricevendo. – TheUndeadFish

1

Quello che hai è un riferimento circolare classico. È already been discussed qui su Stack Overflow. Basta applicare la risposta accettata su quel thread, sostituendo "struct" per "class" e sei d'oro.

cura per chiarezza

+0

Credo che la risposta accettata faccia esattamente questo. Quindi cambia la parola "struct" nella risposta accettata alla parola "class" e il modello è lo stesso. Si prega di riprendere il tuo ingiustificato downvote, kthxbai – Randolpho

+0

Lì. È fatto – Randolpho

2

Non si può avere Class2 contenere un'istanza di Class1 e hanno Class1 contenere un'istanza di Class2. Quello che puoi fare è che ogni classe contenga un riferimento o un puntatore e un'istanza dell'altro tipo di classe (con i riferimenti avanzati appropriati). cioè


class Class2; 
class Class1 
{ 
    Class2& class2Instance; 
}; 

class Class1; 

class Class2 
{ 
    Class1& class1Instance; 
}; 
3

Le due strutture infinitamente recurse l'un l'altro - di conoscere Class1 s' formato che avete bisogno di conoscere le dimensioni del Class2 che richiede la dimensione della Class1, etc. Per ovviare al problema, utilizzare un puntatore in almeno uno dei casi:

#ifndef HEADER1_H 
#define HEADER1_H 

class Class2; // no need to include Header2 

class Class1 
{ 
    Class2* class2Instance; 
} 

#endif 
7

File: header1.h

#ifndef HEADER1_H 
#define HEADER1_H 

class Class2; // no need to include Header2 

class Class1 
{ 
    Class2* class2Instance; 
} 

#endif 

di file: header1.cpp

#include "header2.h" // do include Header2 here, otherwise you will get errors 

adattato da here

Problemi correlati