在C ++中具有相同类的属性

时间:2013-06-29 01:42:24

标签: c++ class object data-structures

我想用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 ++类完成此操作?

3 个答案:

答案 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()。如果您想访问左侧孩子的keyparent.leftChild->key会执行此操作(请注意:您有责任检查nullptr

答案 2 :(得分:0)

我认为你的代码应该是这样的

class MTree {
    public:
        int key;
        int bf;

        MTree * leftChild;
        MTree * rightChild;

        MTree() {}
        ~MTree() {};
}