この記事は3年以上前に書かれた記事です。情報が古い可能性があります。
VC++ で、例えば次のような書き方をしたとする。
class Test2;// 宣言
class Test1
{
public:
Test1();
~Test1();
Test2 m_test2; // ← Test2 をメンバに持たせる。
};
class Test2
{
public:
Test2();
~Test2();
};
すると、
error C2079: ‘Test1::m_test2’ が 未定義の class ‘Test2’ で使用しています。
というコンパイルエラーになる。これは m_test2 を定義する時点で、まだ Test2 というクラスを認識できていないから(コンパイラはコード上から順番に読み込んでる)なので、
class Test2;// 宣言
class Test1
{
public:
Test1();
~Test1();
Test2 *m_test2; // ← ポインタにする。
};
class Test2
{
public:
Test2();
~Test2();
};
とすればコンパイルは通る。ポインタであれば後から定義されたものでも認識するらしい。
もしくは、Test2 を Test1 より先に書いても良い。