クラスまたは構造体を定義するために、コンパイラはクラスの各メンバー変数の大きさを知る必要があります。前方宣言はこれを行いません。ポインターと(あまり頻繁ではありませんが)参照に使用されているのを見たことがあります。
それを超えて、あなたがここでやろうとしていることはできません。クラス A のオブジェクトを含む別のクラス B のオブジェクトをクラス A に含めることはできません。ただし、クラス Aのオブジェクトを含むクラス B へのポインタをクラス A に含めることはできます。
B.cpp
#include "B.h"
void B::SomeFunction()
{
}
Bh
#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__
ああ
#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__
2点。まず、何らかの形式の冪等性を使用して、コンパイル単位ごとにヘッダーが複数回含まれないようにしてください。次に、C++ では、クラスと構造体の唯一の違いはデフォルトの可視性レベルであることを理解してください。クラスはデフォルトでプライベート可視性を使用し、構造体はデフォルトでパブリック可視性を使用します。次の定義は、C++ で機能的に同等です。
class MyClass
{
public: // classes use private visibility by default
int i;
MyClass() : i(13) { }
};
struct MyStruct
{
int i;
MyStruct() : i(13) { }
};