だから、私は問題を抱えています:
クラス A はクラス B について知る必要があり、クラス B はクラス C について知る必要があり、クラス C はクラス A について知る必要があります。これは本質的に円であるため、定義エラーが発生します。私は前方宣言を試みましたが、一番上にあるものは何でも、一番下に何が起こっているのかわかりません。
このような状況についてどうすればよいでしょうか?
ありがとう
デビッド
だから、私は問題を抱えています:
クラス A はクラス B について知る必要があり、クラス B はクラス C について知る必要があり、クラス C はクラス A について知る必要があります。これは本質的に円であるため、定義エラーが発生します。私は前方宣言を試みましたが、一番上にあるものは何でも、一番下に何が起こっているのかわかりません。
このような状況についてどうすればよいでしょうか?
ありがとう
デビッド
これが単純なものであると仮定すると、Adam Mihalcin による上記のコメントは、同様の質問がそれに答えるという点で正しいです。しかし、とにかくコード化します。
これがあると仮定します(メソッド定義は関係ありません):
class A
{
B* ptrB;
}
class B
{
C* ptrC;
}
class C
{
A* ptrA;
}
次に、Adam がリンクしたように、次のように 3 つすべてを forward-delcare できます。
class A;
class B;
class C;
そして、そのブロックを 3 つすべての上に置きます。ただし、ここで重要なことは、他のクラスへのポインターがある場合であり、それらがクラスの一部である構成ではありません。前方宣言を使用して、ポインターを処理するときに物事を正しくコンパイルできるようにすることができますが、他のデータ型を処理することはできません。したがって、これがあった場合:
class D
{
B myB;
}
他のすべてが上記と同じであれば、B の「実際の」定義を D の「実際の」定義の上に置く必要があります。しかし、残りは同じである可能性があります。前方宣言は、ポインターに対してのみ「機能」します。
ただし、ポインターを使用して依存ループをどこかで中断する必要があります。ポインターが存在しない場合、データ構造は「無限」であるため、機能しません。これは、私の例では、Dには常にB が含まれているためです。しかし、A に常に B が含まれ、B に常に C が含まれ、C に常に A が含まれているとしたらどうでしょうか。最後の A には別の B が必要で、別の B には別の C が必要です。ただし、ポインターを使用すると、ループできます。コンポジション(ポインターではない)では、ループすることはできません。
できることは、クラス C のヘッダー ファイルでクラス A を前方宣言し、.cpp ファイルにクラス A のヘッダーを含めることです。
クラス A を転送宣言する方法のリファレンスについては、このリファレンスを参照してください - C++ での転送宣言
おそらく、設計レベルのエラーが発生しただけです。
ただし、たとえば、これを行う必要がある場合は、C のヘッダー ファイルに詳細な実装を提示せずに、空のクラス A、B を宣言することにより、前方宣言を利用してみてください。次に、A と B のヘッダーを使用する必要があるときに C の実装ファイルに含めます。
クラス C の宣言ではポインタしか使用できないことに注意してください。
クラスが密結合している場合は、次のことができます
それ以外の場合は、次のことができます
しかし、ほとんどの場合、設計レベルのエラーが発生している可能性があります。エラーが発生した場合は、それを修正してください。
ヘッダー ファイルでは、次の構成を使用します。
#ifndef MYCLASS_HPP__20120410__0747
#define MYCLASS_HPP__20120410__0747
// Your definions of class, struct, etc...
#endif//
また、含まれるすべてのファイル (self Myclass.hpp を除く) は、クラス ヘッダー ファイル Myclass.hpp にある必要があります。彼は Myclass.cpp ファイルに含まれている必要があります。