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

rod*_*ves 1 c++ class object data-structures

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

\n\n

在 CI 中可以这样做:

\n\n
typedef struct avl {\n    int key;\n    int bf;\n    struct avl *leftChild;\n    struct avl *rightChild;\n} AVLTree;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在我的 C++ 代码中尝试了以下操作:

\n\n
class MTree {\n    public:\n        int key;\n        int bf;\n\n        MTree leftChild;\n        MTree rightChild;\n\n        MTree() {}\n        ~MTree() {};\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它不起作用,并且给我以下错误消息:

\n\n

mtree-ops.cpp:12: error: field \xe2\x80\x98leftChild\xe2\x80\x99 has incomplete type

\n\n

mtree-ops.cpp:13: error:error: field \xe2\x80\x98rightChild\xe2\x80\x99 has incomplete type

\n\n

所以你看,看起来我不能说我的类有它自己类型的属性,因为这就像试图引用定义时并不真正存在的东西。如何使用 C++ 类来完成此操作?

\n

小智 5

(我还不能发表评论。)

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

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

class MTree
{
[...]
public:
    MTree* leftChild;
    MTree* rightChild;
};
Run Code Online (Sandbox Code Playgroud)

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