我想用C ++实现一个通用的树结构 - 用类! - 这个树由一个键(在我的例子中是一个整数)和一个leftChild和rightChild属性组成,它们应该是与树本身相同的类型
在C中,我可以这样做:
typedef struct avl {
int key;
int bf;
struct avl *leftChild;
struct avl *rightChild;
} AVLTree;
我在C ++代码中尝试了以下内容:
class MTree {
public:
int key;
int bf;
MTree leftChild;
MTree rightChild;
MTree() {}
~MTree() {};
}
但它不起作用,它给我以下错误信息:
mtree-ops.cpp:12: error: field ‘leftChild’ has incomplete type
mtree-ops.cpp:13: error:error: field ‘rightChild’ has incomplete type
所以你看,看起来我不能说我的类有自己类型的属性,因为这就像试图引用定义时不存在的东西一样。如何使用C ++类完成此操作?
答案 0 :(得分:2)
(我还不能发表评论。)
简而言之,MTree leftChild
会有两个MTree
个孩子,每个孩子都有两个孩子,依此类推。因此,MTree
个对象会无限大,因为它们将包含无限多个MTree
个实例。
参见基本相同的this question。如前所述,您必须求助于指向子项的引用或指针,使单个MTree
个对象的大小有限。例如,
class MTree
{
[...]
public:
MTree* leftChild;
MTree* rightChild;
};
(您可以将MTree*
替换为MTree&
。)
答案 1 :(得分:1)
以下是C ++ 11的自动执行方式:
#include <memory>
class MTree {
public:
int key;
int bf;
std::unique_ptr<MTree> leftChild;
std::unique_ptr<MTree> rightChild;
MTree():key(0), bf(0) {}
~MTree() {};
};
std::unique_ptr
是一个智能指针,其开销接近零,表示包含struct
所有权的指针,可以是nullptr
。
要添加孩子,只需leftChild.reset( new MTree );
当父级被销毁时,其所有子级都将被自动销毁。如果您想从父母那里接过孩子,请执行std::unique_ptr<MTree> branch = std::move( parent.leftChild );
,其声明对左孩子的所有权并将其从父母中删除。
如果您只想要一个非拥有指针,请使用parent.leftChild.get()
。如果您想访问左侧孩子的key
,parent.leftChild->key
会执行此操作(请注意:您有责任检查nullptr
。
答案 2 :(得分:0)
我认为你的代码应该是这样的
class MTree {
public:
int key;
int bf;
MTree * leftChild;
MTree * rightChild;
MTree() {}
~MTree() {};
}