考慮從WinAPI的這個類:C++ - 與對象名稱typedef結構的正向聲明
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
我提高它在一個名爲Rect
類,它可以讓你乘/加/減/比較兩個Rect
小號,以及其他功能。我需要我的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
? 提前:)感謝
只是一個說明。我做了同樣的事情,我也想要一個RECT結構的增強版本。最後,我的結構派生自RECT,因爲當使用期望RECT爲參數的winapi函數時,不需要投射。我發現這是一個更好的解決方案,您可能會考慮到這一點 – roohan
@ user1017443這是一個好主意。我最初考慮過這個問題,但是我決定反對它,因爲我想要'寬度'和'高度'而不是'cx'和'cy'。其中,這可能不是一個很好的藉口,因爲看到這種方式需要更多的關於課堂用戶的文章。 –
但是要麼在文件中包含''。 –