A、B、C の 3 つのクラスがあります。C は#include
B によって編集され、B は#includ
A によって編集されます。クラス C では、ボタンのハンドラーを定義し、ボタンが押されると、C はPostMessage
オブジェクト Aに移動します。 C に A を含めると、循環参照が発生するため、この循環参照を回避するにはどうすればよいですか?
編集: すべてのインクルードは実装ファイルで作成されます。
A、B、C の 3 つのクラスがあります。C は#include
B によって編集され、B は#includ
A によって編集されます。クラス C では、ボタンのハンドラーを定義し、ボタンが押されると、C はPostMessage
オブジェクト Aに移動します。 C に A を含めると、循環参照が発生するため、この循環参照を回避するにはどうすればよいですか?
編集: すべてのインクルードは実装ファイルで作成されます。
前方宣言を使用する必要があります。C
は の所有者ではないため、A
メンバとしてポインタがあると仮定します。したがって、以下を含める必要はありません。
class A; //forward declaration
class C
{
A* a;
};
実装ファイルに含めますA.h
が、それで問題ありません。A.h
また、可能であれば、 andで前方宣言を使用してくださいB.h
。
クラス X がポインタによってのみクラス Y を使用する場合、クラス X を宣言する前に、クラス Y の前方宣言を使用する必要があります。
前方宣言を別のファイルに保持することをお勧めします。iosfwd は、このアプローチの標準的な例です
クラス X が別の方法でクラス Y を使用する場合 (たとえば、型 Y のメンバーがある場合)、クラス Y の定義全体が必要であり、前方宣言は行いません。
同じヘッダー ファイルの循環参照を参照している場合、一般的な規則は、この MyHeader.h ファイルのように、定義が 1 回だけ含まれるようにヘッダーを定義でラップすることです。
#ifndef MyHeader_h
#define MyHeader_h
// my definitions here
#endif // MyHeader_h
#pragma once
ディレクティブも広くサポートされています。