从WinAPI考虑这个类:
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
?
答案 0 :(得分:3)
您可以乘法声明一个typedef名称,并同时转发声明结构名称:
typedef struct tagRECT RECT;
请注意,您无法调用返回不完整类型的函数,因此如果operator RECT() const
仅向前声明,则无法调用转换tagRECT
。
答案 1 :(得分:3)
在实际解除引用类型之前,您不需要知道函数定义。
因此,您可以在标头文件中转发声明(因为您不会在此处进行任何解除引用),然后在源文件中包含Windows.h
。
[edit] 没看到它是一个typedef。但是,另一个答案是错误的:there is a way to (kind of) forward declare a typedef。