Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中用对象名转发TyBuffFrastFrutt的声明_C++_Winapi_Struct_Typedef_Forward Declaration - Fatal编程技术网

在C++中用对象名转发TyBuffFrastFrutt的声明

在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的唯一真正原因是,该类具有一个转换运算符,该运

考虑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中,我不想包含,我只想包含在源文件中,这样我就可以保持我的包含树很小

我知道可以像这样向前声明结构: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结构的成员。是的,从用户的角度来说,派生更容易。