循環参照
循環参照とは、プログラミングにおけるソースコード上の問題であり、ある二つの物の定義の際に、お互いを必要としてしまい、定義が定まらなくなってしまい、結果どちらも定義できないことを指します。
簡単にいえば、Aというものを定義する時に、未定義のBというものを用い、そのBを定義する時に、未定義のAを用いるという状況です。例えば、Aさんの家の住所を定める時に、「Aさんの家はBさんの家の向かいです。」と定義したとします。この定義に従えば、Bさんの家の住所さえ分かれば、Aさんの家を特定できます。ここで、「Bさんの家の住所はAさんの家の向かいです。」と定義すると、どちらも未知のものであるので、特定することが出来なくなります。こういった状況が循環参照問題です。
プログラミングにおいては、ヘッダーファイルやオブジェクト指向プログラミングのクラス等でしばしば起こります。丁度以下のような例です。
class_A.h
#include "class_B.h"
class ClassA
{
ClassB B;
};
class_B.h
#include "class_A.h"
class ClassB
{
ClassA A;
};
上記例では、ClassAはその定義にClassBを、ClassBはその定義にClassAを持ってしまいます。この場合、ClassAの中身を決めようにもClassBが分からないので、定義が定まりません。そのため、事前にClassAやClassBを前方宣言し、かつクラスの記載をClassA A等と記載せずに、ClassA* pA等とポインタで記載する必要があります。ポインタで記載することで、クラスのサイズが定まらなくとも良い、という状況が生まれます。