それを修正する方法はありますが、クラス編成が壊れていることも意味します。
これを修正する方法は「インクルード ガード」と呼ばれますが、多くのコンパイラもこの#pragma once
ディレクティブをサポートしています。#pragma once
全体が解析されるまでヘッダーファイルが含まれているとはおそらく見なされないため、機能していないと思います。また、ヘッダー ファイルの途中で再帰的なインクルードが発生するため、まだ解析が完了していません。
インクルード ガードは次のようなものです。
ClassA.h で:
#pragma once // Just because. It really should help.
#ifndef INCLUDED_CLASSA_H
#define INCLUDED_CLASSA_H
#include "ClassB.h"
//... rest of header file
#endif
ClassB.h で:
#pragma once // Just because. It really should help.
#ifndef INCLUDED_CLASSB_H
#define INCLUDED_CLASSB_H
#include "ClassA.h"
//... rest of header file
#endif
組織の問題は循環依存と呼ばれ、循環依存は一般的に悪い考えです。それらを壊すにはさまざまな方法がありますが、どの方法を使用するかは、依存関係の正確な性質と元の理由によって異なります。
問題に応じて、さまざまな手法のいずれかを使用できます。
- 共通の基本クラスからの継承
- 2 つのクラスのうちの 1 つを他のクラスの基本クラスに変える- これは前のクラスの変形です。
- 前方宣言 - 循環依存関係を実際に壊すわけではなく、問題のある循環インクルード依存関係も必要ないように配置するだけなので、これはあまり望ましくありません。
- 両方のクラスの一部を両方が使用できるクラスに変換する- これは、継承の代わりに構成を使用する共通基本クラスの別の変形です。
他にもテクニックがあります。実際、循環依存関係を取り除くことが本の大きなテーマであるため、さまざまな状況で使用できる非常に多様な手法が記載された本があります。その本は、John Lakos による「Large-Scale C++ Software Design」です。