层树,没有适当的默认构造函数可用

Layer trees, No appropriate default constructor available

本文关键字:默认 构造函数 层树      更新时间:2023-10-16

我试图实现一个RB-Tree,在我的树每个节点也有一个指针到另一个RB-Tree。我的代码是这样的:

class node{
    tree* subTree;
    . . . //some code goes here      
   node(){
      subTree = new tree; //error here !!
   }
};

class tree{
  . . . //some code
};

问题是,由于nodetree之前定义,编译器给我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是完全可用的,并且可以毫无问题地定义构造函数。希望这对你有意义。

相关:什么时候可以使用前向声明?