WinAPI からの次のクラスを検討してください。
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
他の機能とともに、Rect
2 つの s を乗算/加算/減算/比較できるようにするという名前のクラスでそれを強化しています。クラスが知ってRect
おく必要がある唯一の本当の理由は、クラスが aを として渡し、を割り当てることを可能にする変換演算子を備えているためです。Rect
RECT
Rect
RECT
RECT
しかし、ファイルRect.h
には を含めたくありません。ソース ファイル<Windows.h>
にのみ含めたい<Windows.h>
ので、インクルージョン ツリーを小さく保つことができます。
構造体は次のように前方宣言できることを知っています:struct MyStruct;
しかし、構造体の実際の名前は でtagRECT
あり、オブジェクト リストがあるため、前方宣言の方法について少し混乱しています。これが私のクラスの一部です:
// Forward declare RECT here.
class Rect {
public:
int X, Y, Width, Height;
Rect(void);
Rect(int x, int y, int w, int h);
Rect(const RECT& rc);
//! RECT to Rect assignment.
Rect& operator = (const RECT& other);
//! Rect to RECT conversion.
operator RECT() const;
/* ------------ Comparison Operators ------------ */
Rect& operator < (const Rect& other);
Rect& operator > (const Rect& other);
Rect& operator <= (const Rect& other);
Rect& operator >= (const Rect& other);
Rect& operator == (const Rect& other);
Rect& operator != (const Rect& other);
};
これは有効でしょうか?
// Forward declaration
struct RECT;
RECT
の単なるエイリアスであるため、私の考えはノーですtagRECT
。つまり、これを行った場合でもヘッダー ファイルが有効であることはわかっていますが、ソース ファイルを作成してそこにRect.cpp
インクルードすると、そこで問題が発生するのではないかと心配しています。<Windows.h>
どうすれば前方宣言できRECT
ますか?