C での相互依存クラスの作成
この質問では、それぞれが他のクラス型のオブジェクトを含む 2 つの C クラスを作成する方法を検討します。ただし、この直接的なアプローチでは、循環参照によるエラーが発生します。
直接実装
2 つのクラス foo と bar を定義しようとする次のヘッダー ファイルについて考えてみましょう。 、それぞれが他のクラス型の保護されたメンバーを持ちます:
// bar.h #include "foo.h" class bar { foo f; }; // foo.h #include "bar.h" class foo { bar b; };
このコードをコンパイルすると、両方ともエラーが発生します。ヘッダーは相互にインクルードされ、循環参照を作成します。
回避策: 前方宣言とポインター
この参照サイクルを断ち切るには、前方宣言とポインターを使用できます。前方宣言を使用すると、メンバーを定義せずにクラスの存在を宣言できます。
変更されたヘッダー ファイルは次のとおりです。
// bar.h class foo; // Forward declaration of foo class bar { foo* f; }; // foo.h class bar; // Forward declaration of bar class foo { bar* b; };
これらの前方宣言を使用すると、ヘッダーを作成せずに相互にインクルードできます。循環参照。クラス メンバーの実際の定義は、必要なヘッダーが含まれる対応する .cpp ファイルに配置されます。
ポインターの使用
ポインターを使用してクラスを使用するには、相互へのポインターを持つ foo と bar のインスタンスを作成します。
// main.cpp #include "foo.h" #include "bar.h" int main() { foo myFoo; bar myBar; myFoo.f = &myBar; // Assign the address of myBar to myFoo's f myBar.b = &myFoo; // Assign the address of myFoo to myBar's b }
この回避策により、次のように作成できます。ポインタを使用して相互依存オブジェクトを持つクラスを作成し、参照サイクルを中断し、有効なプログラムを作成します。
以上が循環参照を使わずに相互依存する C クラスを作成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。