层树,没有适当的默认构造函数可用
Layer trees, No appropriate default constructor available
我试图实现一个RB-Tree,在我的树每个节点也有一个指针到另一个RB-Tree。我的代码是这样的:
class node{
tree* subTree;
. . . //some code goes here
node(){
subTree = new tree; //error here !!
}
};
class tree{
. . . //some code
};
问题是,由于node
在tree
之前定义,编译器给我No appropriate default constructor available
。如果我将节点类移动到树类之后,那么同样的问题将再次发生在node
的构造器上。我该怎么办?
前向声明类tree
,然后在类node
中只使用构造函数声明,
class tree; // forward declaration, allows node to contain incomplete tree types
class node
{
tree* subTree;
public:
//some code goes here
node(); // only the declaration
};
,最后在类之外定义node
的构造函数,但是在之后是tree
类的完整定义,
class tree
{
// implementation
};
node::node()
{
subTree = new tree; // no more error here !!
}
Coliru的实例这里的技巧是,类可以包含不完整类型(即只有声明可用的类型,而不是完整的定义),只要您将它们用作指针/引用而不需要计算/使用它们的大小。因此,您可以在类node
之前转发声明tree
,然后在类node
中声明指针tree* subtree
,并且只声明构造函数。然后,您可以定义构造函数,在类之后,tree
已经完全定义,因为在构造函数中,由于subTree = new tree;
语句,您需要tree
的大小。但是现在可以了,因为类tree
是完全可用的,并且可以毫无问题地定义构造函数。希望这对你有意义。
相关:什么时候可以使用前向声明?
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 具有非默认构造函数的单例类
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在C++中使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数的情况下创建的派生对象
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 创建类类型的动态分配数组,其中类不得具有默认构造函数