ホームページ > バックエンド開発 > C++ > ヘッダー ファイル内の循環 #include 依存関係を解決するにはどうすればよいですか?

ヘッダー ファイル内の循環 #include 依存関係を解決するにはどうすればよいですか?

DDD
リリース: 2024-12-19 22:48:10
オリジナル
477 人が閲覧しました

How Can I Resolve Circular #include Dependencies in Header Files?

循環 #include 依存関係について

GameEvent、Physics、およびGameObject では、クラスの再定義を防ぎながら、必要なオブジェクトへのアクセスを許可することが重要です。 headers.

保護されていない #include の問題

保護策なしで「GameObject.h」に「Physics.h」をインクルードすると、「GameObject.h」のため再定義エラーが発生します。 h」には、すでに「Physics.h」から「GameEvents.h」が含まれています。この再定義は、プリプロセッサが「Physics.h」のコードを「GameObject.h」にコピーアンドペーストするときに発生します。

インクルード ガードの紹介

インクルード ガードは、次のマクロです。ヘッダー ファイルの重複インクルードを防ぎます。ヘッダー ファイルが 2 回インクルードされると、インクルード ガードにより 2 番目のコピーがインクルードされるのが防止されます。これにより、再定義の問題が解決されます。

入れ子になった #include の危険性

この場合、依存関係グラフは循環します。 「GameEvents.h」には「Physics.h」が含まれ、「Physics.h」には「GameObject.h」が含まれており、ループが作成されます。 #include ステートメントが無限に繰り返され、コードが過度に肥大化するため、この循環依存関係は問題を引き起こします。

解決策: 前方宣言

循環依存関係を解決するには、forward を使用します。宣言。前方宣言は、完全な定義を提供することなく、特定のクラスが存在することをコンパイラーに伝えます。 「GameEvents.h」と「GameObject.h」で「Physics」を前方宣言することで、ヘッダー ファイルは実際に互いのコードを含めることなく相互にアクセスできます。

// GameEvents.h
class GameObject;
class Physics;
ログイン後にコピー
// Physics.h
#include <list>

class GameObject;

class Physics
{
public:
    void ApplyPhysics(GameObject*);
    // ...
};
ログイン後にコピー
// GameObject.h
class GameObject
{
public:
    GameObject(Vector2X position);
    // ...
};
ログイン後にコピー

このようにヘッダー ファイルは、再定義の問題や循環依存関係に遭遇することなく、必要な型と関数にアクセスできます。

以上がヘッダー ファイル内の循環 #include 依存関係を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート