在C++中用对象名转发TyBuffFrastFrutt的声明
考虑WinAPI中的此类:在C++中用对象名转发TyBuffFrastFrutt的声明,c++,winapi,struct,typedef,forward-declaration,C++,Winapi,Struct,Typedef,Forward Declaration,考虑WinAPI中的此类: typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT; 我在一个名为Rect的类中对其进行了增强,该类允许您对两个Rect进行乘法/加法/减法/比较,以及其他功能。我需要我的Rect类了解Rect的唯一真正原因是,该类具有一个转换运算符,该运
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中,我不想包含,我只想包含在源文件中,这样我就可以保持我的包含树很小
我知道可以像这样向前声明结构: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);
};
我的想法是否定的,因为RECT只是tagRECT的别名。我的意思是,如果我这样做,我知道头文件仍然有效,但是当我创建源文件Rect.cpp并包含在其中时,我担心这就是我将遇到问题的地方
如何向前声明RECT?您可以多次声明typedef名称,同时也向前声明结构名称:
typedef struct tagRECT RECT;
请注意,您不能调用返回不完整类型的函数,因此,如果tagRECT仅被正向声明,则无法调用转换运算符RECT const。您可以多次声明typedef名称,同时也可以正向声明结构名称:
typedef struct tagRECT RECT;
请注意,您不能调用返回不完整类型的函数,因此,如果tagRECT只是前向声明的,则不能调用转换运算符RECT const。在实际取消引用该类型之前,您不需要知道函数定义 因此,您可以在头文件中转发declare,因为您不会在这里进行任何取消引用,然后在源文件中包含Windows.h
[编辑]没有看到它是一个typedef。但是,另一个答案是错误的:。在实际取消引用类型之前,不需要知道函数定义 因此,您可以在头文件中转发declare,因为您不会在这里进行任何取消引用,然后在源文件中包含Windows.h
[编辑]没有看到它是一个typedef。但是,另一个答案是错误的:。您实际上可以向前声明一个刚刚发现的typedef,请参阅我的answer@MaëlNison:它实际上不是一个typedef的转发声明,它是一个不完整类型的完整typedef。你可以转发声明一个刚刚发现的typedef,请参见我的主页中的链接answer@MaëlNison:它实际上不是一个typedef的转发声明,它是一个完整的typedef,一个不完整的类型。谢谢,我不知道。这当然不是一个好的做法,但在这种情况下,这是M$的错,而不是OP的错。它实际上不是typedef的前向声明,而是多个必须兼容的声明。如果某个东西被声明为extern C,这会有什么不同吗?我想知道是否有任何windows头文件是这样声明的,这可能会对C接口产生什么影响,但是,Extn C是一个链接修饰符,类型和类型DEFS没有链接,所以它不应该是什么。@ PATATOSWATTER——我想知道C中的同一个成员的结构是否与C++中的大小不同,这可能会影响其他情况下的事情,因为C++中的结构和类非常接近,但很明显,只有一个存在于C。谢谢,我不知道。这当然不是一个好的做法,但在这种情况下,这是M$的错,而不是OP的错。它实际上不是typedef的前向声明,而是多个必须兼容的声明。如果某个东西被声明为extern C,这会有什么不同吗?我想知道是否有任何windows头文件是这样声明的,这可能会对C接口产生什么影响,但是,Extn C是一个链接修饰符,类型和类型DEFS没有链接,所以它不应该是什么。@ PATATOSWATTER——我想知道C中的同一个成员的结构是否与C++中的大小不同,这可能会影响其他情况下的事情,因为C++中的结构和类非常接近,但很明显,C中只有一个存在,只是一个注释。我做了同样的事情,我还想要一个增强版的RECT结构。最后,我的结构是从RECT派生的,因为当使用期望使用RECT作为参数的winapi函数时,不需要强制转换。我发现这是一个更好的解决方案,你可以考虑account@user1017443那是个好主意。我最初考虑过它,但我决定反对它,因为我想要的是“宽度”和“高度”,而不是“cx”和“cy”。这可能不是一个很好的借口,因为这样做需要对类用户进行更多的写入。但无论哪种方式,都需要在文件中包含。例如,您仍然可以定义名为Width的成员函数,这些函数只返回RECT结构的成员。是的
从用户的角度来说,派生更容易。只是一个注释。我做了同样的事情,我还想要一个增强版的RECT结构。最后,我的结构是从RECT派生的,因为当使用期望使用RECT作为参数的winapi函数时,不需要强制转换。我发现这是一个更好的解决方案,你可以考虑account@user1017443那是个好主意。我最初考虑过它,但我决定反对它,因为我想要的是“宽度”和“高度”,而不是“cx”和“cy”。这可能不是一个很好的借口,因为这样做需要对类用户进行更多的写入。但无论哪种方式,都需要在文件中包含。例如,您仍然可以定义名为Width的成员函数,这些函数只返回RECT结构的成员。是的,从用户的角度来说,派生更容易。