C++ 同一类中类型的前向声明

C++ 同一类中类型的前向声明,c++,C++,我有一个类,在一个类中有几个简单的结构(简化代码): typedef struct { Struct2* str2; }Struct1; typedef struct { Struct3* str3; Struct1* str1; }Struct2; typedef struct { Struct1* str1; Struct2* str2; Struct3* str3; }Struct3; 当然,这给了我语法错误。所以我向前声明

我有一个类,在一个类中有几个简单的结构(简化代码):

typedef struct  
{
    Struct2* str2;
}Struct1;

typedef struct  
{
    Struct3* str3;
    Struct1* str1;
}Struct2;

typedef struct  
{
    Struct1* str1;
    Struct2* str2;
    Struct3* str3;
}Struct3;

当然,这给了我语法错误。所以我向前声明了每一个,但这不起作用,因为我有重新定义。我希望避免将每个结构放在单独的文件中;这是可能的吗?

与其将每个类型声明为
typedef
,不如像类一样使用
struct
关键字。这样,您的定义就不会像转发声明的重新定义

struct Struct1;
struct Struct2;

struct Struct1
{
    Struct2* str2;
};  

不要将每个类型声明为
typedef
,而是像类一样使用
struct
关键字。这样,您的定义就不会像转发声明的重新定义

struct Struct1;
struct Struct2;

struct Struct1
{
    Struct2* str2;
};  

使用转发声明并定义结构,而不使用
typedef
,如下所示:

struct Struct2; //forward declaration
struct Struct3; //forward declaration

struct Struct1
{
    Struct2* str2; //here Struct2 is known to be a struct (to be defined later though)
};

struct Struct2
{
    Struct3* str3; //here Struct3 is known to be a struct (to be defined later though)
    Struct1* str1;
};

struct Struct3
{
    Struct1* str1;
    Struct2* str2;
    Struct3* str3;
};

使用转发声明并定义结构,而不使用
typedef
,如下所示:

struct Struct2; //forward declaration
struct Struct3; //forward declaration

struct Struct1
{
    Struct2* str2; //here Struct2 is known to be a struct (to be defined later though)
};

struct Struct2
{
    Struct3* str3; //here Struct3 is known to be a struct (to be defined later though)
    Struct1* str1;
};

struct Struct3
{
    Struct1* str1;
    Struct2* str2;
    Struct3* str3;
};

您可以这样转发声明它们:

typedef struct Struct1 Struct1;
typedef struct Struct2 Struct2;
typedef struct Struct3 Struct3;
你这样解决它们:

struct Struct2 { ... };

我使用了命名结构,所以这是有效的C或C++。正如纳瓦兹指出的,C++中根本不需要TyEndof。在C++中,结构的名称自动变成一个类型,但是在C中它不是.< /p> 这是整个单元:

#include <stdio.h>

typedef struct Struct1 Struct1;
typedef struct Struct2 Struct2;
typedef struct Struct3 Struct3;

struct Struct1  {
        Struct2* str2;
} ;

struct Struct2 {
        Struct3* str3;
        Struct1* str1;
} ;

struct Struct3  {
        Struct1* str1;
        Struct2* str2;
        Struct3* str3;
} ;

int main()
{
        printf("Size of Struct1: %d\n", sizeof(Struct1));
        printf("Size of Struct2: %d\n", sizeof(Struct2));
        printf("Size of Struct3: %d\n", sizeof(Struct3));
}
#包括
类型定义结构1结构1;
类型定义结构2结构2;
类型定义结构3结构3;
结构1{
结构2*str2;
} ;
结构2{
结构3*str3;
Struct1*str1;
} ;
结构3{
Struct1*str1;
结构2*str2;
结构3*str3;
} ;
int main()
{
printf(“结构1的大小:%d\n”,sizeof(结构1));
printf(“Struct2的大小:%d\n”,sizeof(Struct2));
printf(“Struct3的大小:%d\n”,sizeof(Struct3));
}

您可以这样转发声明:

typedef struct Struct1 Struct1;
typedef struct Struct2 Struct2;
typedef struct Struct3 Struct3;
你这样解决它们:

struct Struct2 { ... };

我使用了命名结构,所以这是有效的C或C++。正如纳瓦兹指出的,C++中根本不需要TyEndof。在C++中,结构的名称自动变成一个类型,但是在C中它不是.< /p> 这是整个单元:

#include <stdio.h>

typedef struct Struct1 Struct1;
typedef struct Struct2 Struct2;
typedef struct Struct3 Struct3;

struct Struct1  {
        Struct2* str2;
} ;

struct Struct2 {
        Struct3* str3;
        Struct1* str1;
} ;

struct Struct3  {
        Struct1* str1;
        Struct2* str2;
        Struct3* str3;
} ;

int main()
{
        printf("Size of Struct1: %d\n", sizeof(Struct1));
        printf("Size of Struct2: %d\n", sizeof(Struct2));
        printf("Size of Struct3: %d\n", sizeof(Struct3));
}
#包括
类型定义结构1结构1;
类型定义结构2结构2;
类型定义结构3结构3;
结构1{
结构2*str2;
} ;
结构2{
结构3*str3;
Struct1*str1;
} ;
结构3{
Struct1*str1;
结构2*str2;
结构3*str3;
} ;
int main()
{
printf(“结构1的大小:%d\n”,sizeof(结构1));
printf(“Struct2的大小:%d\n”,sizeof(Struct2));
printf(“Struct3的大小:%d\n”,sizeof(Struct3));
}

这就是我要说的,但我有一个疑问,所以我核实了。而且它不是用typedef编译的<代码>错误:冲突声明“typedef struct 2 Struct2”错误:“struct Struct2”以前的声明为“struct Struct2”等(MinGW 4.5.2)@Valke:Ohh。。我不知道typedef会引起问题。无论如何,我编辑了我的帖子。这就是我要说的,但我有一个疑问,所以我核实了。而且它不是用typedef编译的<代码>错误:冲突声明“typedef struct 2 Struct2”错误:“struct Struct2”以前的声明为“struct Struct2”等(MinGW 4.5.2)@Valke:Ohh。。我不知道typedef会引起问题。总之,我编辑了我的帖子。好的,看起来不错,带typedef的结构的原始分辨率没有编译,现在你已经删除了,它编译得很好。好的,看起来不错,带typedef的结构的原始分辨率没有编译,现在你已经删除了,它编译得很好。