Per definire una classe o una struttura, il compilatore deve sapere quanto è grande ogni variabile membro della classe. Una dichiarazione anticipata non lo fa. L'ho sempre visto solo per puntatori e riferimenti (meno spesso).
Oltre a ciò, ciò che stai cercando di fare qui non può essere fatto. Non si può avere una classe A, che contiene un oggetto di un'altra classe B che contiene un oggetto di classe A. È possibile, tuttavia, hanno classe A contenere un puntatore alla classe B che contiene un oggetto di classe A.
B.cpp
#include "B.h"
void B::SomeFunction()
{
}
B.h
#ifndef __B_h__ // idempotence - keep header from being included multiple times
#define __B_h__
#include "A.h"
class B
{
public:
A a;
void SomeFunction();
};
#endif // __B_h__
A.h
#ifndef __A_h__ // idempotence - keep header from being included multiple times
#define __A_h__
#include "B.h"
class B; // forward declaration
struct A
{
B *b; // use a pointer here, not an object
};
#endif // __A_h__
due punti. Innanzitutto, assicurati di utilizzare una qualche forma di idempotence per impedire che le intestazioni vengano incluse più volte per unità di compilazione. In secondo luogo, comprendi che in C++, l'unica differenza tra classi e strutture è il livello di visibilità predefinito: le classi utilizzano la visibilità privata per impostazione predefinita mentre le strutture utilizzano la visibilità pubblica per impostazione predefinita. Le seguenti definizioni sono funzionalmente equivalenti in C++.
class MyClass
{
public: // classes use private visibility by default
int i;
MyClass() : i(13) { }
};
struct MyStruct
{
int i;
MyStruct() : i(13) { }
};
fonte
2009-12-11 02:40:04
Puoi metterli nello stesso file di intestazione? So che non è una risposta particolarmente tecnica, ma puoi evitare tutto insieme facendo ciò se è fattibile. – ihtkwot
Non importa se si mettono entrambe le definizioni di classe nello stesso file di intestazione, si deve ancora arrivare prima e non si può conoscere la dimensione dell'altra classe. – Peter
grazie per i chiarimenti, sono ancora molto nuovo in questo e spero di non aver offerto un cattivo consiglio, che ero – ihtkwot