自我引用课程

时间:2018-05-01 19:29:28

标签: c++

我正在建立一个基于树的数据结构,其中有一个不可变的根,每个节点都分配了一个永不改变的父节点。每个节点都需要对父节点的引用。

我决定使用引用而不是指针,并提出以下尝试来检查特定节点是否是根:

#include <cstdio>

class Obj {
public:
    Obj &parent;
    Obj(Obj &parent) : parent(parent) {}
    int hasparent();
};

int Obj::hasparent()
{
    return &parent != this;
}

int main()
{
    Obj base(base);
    Obj child(base);

    printf("base.hasparent = %d\n", base.hasparent());
    printf("child.hasparent = %d\n", child.hasparent());
    printf("child.parent.hasparent = %d\n", child.parent.hasparent());
}

我想要你的批评。它是否正确?由于不熟悉C ++,我真的很惊讶编译器允许我传递对我尚未构造的对象的引用。这是正确的做法吗?

1 个答案:

答案 0 :(得分:2)

我没有发现您的代码存在问题。如果你想隐藏&#34;奇怪的初始化&#34; &#34; Obj base(base)&#34;,然后你可以实现默认构造函数来设置父对象本身:

Obj() : parent(*this) { }

然后您可以像这样简单地初始化基础:

Obj base;