1

我想用 C++ 实现一个通用的树结构——用类!- 这棵树由一个键(在我的例子中是一个整数)和一个 leftChild 和 rightChild 属性组成,它们应该与树本身的类型相同

在 CI 中可以这样做:

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++ 类来做到这一点?

4

3 回答 3

5

(我还不能发表评论。)

简而言之,MTree leftChild它将有两个MTree自己的孩子,每个孩子都有两个孩子,依此类推。因此,MTree对象将无限大,因为它们将包含无限多的MTree实例。

请参阅本质上相同的这个问题。正如那里所提到的,您必须求助于对子对象的引用或指针,从而为单个MTree对象提供有限的大小。例如,

class MTree
{
[...]
public:
    MTree* leftChild;
    MTree* rightChild;
};

(您可以替换MTree*MTree&。)

于 2013-06-29T01:53:16.910 回答
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 );

当一个父级被销毁时,它的所有子级都被自动销毁。如果你想从父母那里带走一个孩子, do std::unique_ptr<MTree> branch = std::move( parent.leftChild );,它声称对左孩子的所有权并将其从父母那里移除。

如果您只想要一个非拥有指针,请使用parent.leftChild.get(). 如果您想访问左孩子的keyparent.leftChild->key会这样做(注意:您负责检查nullptr.

于 2013-06-29T02:17:19.957 回答
0

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

class MTree {
    public:
        int key;
        int bf;

        MTree * leftChild;
        MTree * rightChild;

        MTree() {}
        ~MTree() {};
}
于 2013-06-29T01:56:13.643 回答