C++ 编译器在正向结构声明中给出错误
我有一个这样的代码,我不能把“struct node”放在“struct mnode”上面 因此我在顶部声明了它,如下所示。C++ 编译器在正向结构声明中给出错误,c++,struct,C++,Struct,我有一个这样的代码,我不能把“struct node”放在“struct mnode”上面 因此我在顶部声明了它,如下所示。 但是编译器说字段n的类型不完整。 如何正确声明顶部的结构 struct node; struct mnode{ int j; node n; }; struct node{ int k; }; 对于类类型的类成员,需要定义。声明不行。因此在这种情况下,node的完整定义必须在mnode之前 转发声明仅在不需要完整定义(指针或引用成员、返回类型或方
但是编译器说字段n的类型不完整。
如何正确声明顶部的结构
struct node;
struct mnode{
int j;
node n;
};
struct node{
int k;
};
对于类类型的类成员,需要定义。声明不行。因此在这种情况下,
node
的完整定义必须在mnode
之前
转发声明仅在不需要完整定义(指针或引用成员、返回类型或方法参数)时有效。对于类类型的类成员,需要定义。声明不行。因此在这种情况下,
node
的完整定义必须在mnode
之前
转发声明仅在不需要完整定义的情况下才起作用-指针或引用成员、返回类型或方法参数。这是因为
节点
是。。。很不完整。结构/类定义中不能有类型不完整的字段。但您可以使用指向节点的指针,因为指针的大小是已知的:
struct node;
struct mnode{
int j;
node* n;
};
struct node{
int k;
};
这是因为
节点是。。。很不完整。结构/类定义中不能有类型不完整的字段。但您可以使用指向节点的指针,因为指针的大小是已知的:
struct node;
struct mnode{
int j;
node* n;
};
struct node{
int k;
};
编译器会抱怨,因为它需要了解有关mnode
的一些信息,而它需要有关节点的更多信息。首先,它需要知道mnode
对象的大小,以便能够构造它,但为此,它需要知道节点的大小。它还需要知道如何生成以下函数:
- 默认构造函数
- 析构函数
- 复制和移动构造函数
- 复制和移动赋值运算符
为此,它需要节点中相应的函数。我可能忘记了一些其他的东西,但是您可以看到,对于很多事情,它需要节点的完整定义。因此,不,事先声明是不行的
如果由于任何原因无法提供节点
的完整定义,可以将n
的类型更改为,例如节点*
。编译器拥有指针的所有信息,因此没有问题。编译器会抱怨,因为它需要了解有关mnode
的一些信息,需要更多有关节点的信息。首先,它需要知道mnode
对象的大小,以便能够构造它,但为此,它需要知道节点的大小。它还需要知道如何生成以下函数:
- 默认构造函数
- 析构函数
- 复制和移动构造函数
- 复制和移动赋值运算符
为此,它需要节点中相应的函数。我可能忘记了一些其他的东西,但是您可以看到,对于很多事情,它需要节点的完整定义。因此,不,事先声明是不行的
如果由于任何原因无法提供节点
的完整定义,可以将n
的类型更改为,例如节点*
。编译器拥有指针的所有信息,因此没有问题。您必须将节点
定义置于mnode
定义之上。如果希望mnode
保存节点
实例,则无法绕过此问题。必须将节点
定义置于mnode
定义之上。如果您希望mnode
保存节点
实例,那么没有办法解决这个问题。您还可以使用来自前向声明(节点&
(尽管我只将其用于函数定义)和智能ptr(std::unique(ptr
)的引用。您还可以使用来自前向声明(节点&
)的引用(尽管我只在函数定义中使用它)和智能ptr(std::unique\u ptr
)。