ホームページ  >  記事  >  バックエンド開発  >  循環参照を使わずに相互依存する C クラスを作成するには?

循環参照を使わずに相互依存する C クラスを作成するには?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-09 22:20:04958ブラウズ

How to Create Interdependent C   Classes Without Circular References?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。