クラスの相互参照について

あるプログラムを作っていて,クラス同士がお互いを参照し合う場合にコンパイルできないという状況になってしまいました.以下がそのサンプルソースです.

// main.c
class A {
  B a_instance;
};

class B {
  A b_instance;
};
  
int main()
{
  
  return 0;
}

たしかに、class Aが定義された時点ではclass Bは定義されていない訳で

% g++ main.cpp
main.cpp:2: error: 'B' does not name a type

と怒られるのも当然です。class AとBの順番を逆にしたところで、今度はAなんて知らないというエラーメッセージが出て同じ結果となります。

調べてみたところ、この状態をクラスの相互参照と言うことが分かりました.解決する為には

  • 不完全なクラス宣言をする
  • クラスの参照をポインタで行う

を行う必要があります。不完全なクラス宣言は関数プロトタイプのようなものです。以下、修正版のソースです。

// main.c
class B;      // クラスの先送り宣言

class A {
  B *a_ptr;  // クラスBはポインタで参照
};

class B {
  A *b_ptr;  // クラスAはポインタで参照
};
  
int main()
{
  
  return 0;
}

このようにすることで,コンパイルができるようになりました.

C++レベルがあまりにも低いので,詳しい本を購入して勉強したいところです.