1

WinAPI からの次のクラスを検討してください。

typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

他の機能とともに、Rect2 つの s を乗算/加算/減算/比較できるようにするという名前のクラスでそれを強化しています。クラスが知ってRectおく必要がある唯一の本当の理由は、クラスが aを として渡し、を割り当てることを可能にする変換演算子を備えているためです。RectRECTRectRECTRECT

しかし、ファイル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ますか?

4

2 に答える 2

3

typedef 名を多重宣言し、同時に構造体名を前方宣言することもできます。

typedef struct tagRECT RECT;

https://ideone.com/7K7st7

不完全な型を返す関数を呼び出すことはできないため、前方宣言のみのoperator RECT() const場合は変換を呼び出すことができないことに注意してください。tagRECT

于 2012-11-16T01:20:26.763 に答える
3

実際に型を逆参照する前に、関数定義を知る必要はありません。

そのため、ヘッダーファイルで前方宣言し(ここでは逆参照を行わないため) Windows.hソースファイルに含めることができます。

[編集]それが typedef であることを知りませんでした。ただし、他の答えは間違っています。 typedef を (一種の) 前方宣言する方法があります

于 2012-11-16T01:20:48.417 に答える