1

考虑 WinAPI 中的这个类:

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

我在一个名为的类中对其进行了增强,该类Rect允许您乘/加/减/比较两个Rects,以及其他功能。我需要我的Rect班级了解的唯一真正原因RECT是因为该班级具有转换运算符,允许将 aRect作为 a 传递RECT,并分配给 a 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

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 回答