如何创建一个可以在c ++中将自身保存为变量的类?

时间:2018-09-04 10:52:52

标签: c++ class oop forward-declaration incomplete-type

我对c ++还是相当陌生,我的大部分写作都是使用Python。

在Python中,如果我想创建一个类来保存有关人类的信息,则可以编写一个类,该类可以将其“父级”作为其变量之一。在Python中,我会大致这样:

class Human:

    def __init__(self, name):
        self.name = name


first = Human("first")
second = Human("second")

second.parent = first

其中second.parent = first表示人类second的父母是人类first

在c ++中,我尝试实现类似的东西:

class Human {

    public:
        Human parent;

};

int main() {
    Human first = Human();
    Human second = Human();

    second.parent = first;
}

此示例带有错误field has incomplete type: Human。我明白了这一点,因为这是因为我尚无法在人类对象中包含人类,因为还没有关于人类是什么的完整定义。当我搜索相关帖子时,我会不断提出使用前向声明和指针的解决方案,但是我无法使其正常工作。

我真的很感谢在使c ++示例按照我希望的方式运行时所提供的帮助。

谢谢。

4 个答案:

答案 0 :(得分:4)

例如,通过使用指针:

struct Human
{
    Human* parent;  // The symbol Human is declared, it's okay to use pointers to incomplete structures
};

int main()
{
    Human first = Human();
    Human second = Human();

    second.parent = &first;  // The & operator is the address-of operator, &first returns a pointer to first
}

您也可以使用引用,但是使用它们和初始化它们会有些困难。

答案 1 :(得分:0)

你能做的是

class Human {

public:
    Human * parent = nullptr;

};

它应该是一个指针,并且最好进行初始化。

答案 2 :(得分:0)

这里的指针很有意义,指针将内存地址保存到您要引用的内容中,而不在该类中存储实际数据。

E.G

class Human {

public:
    Human * parent;

};

您的父母现在实际上已存储为一个内存地址,但是与* parent一起被使用为一个对象,例如,您可以这样做: myHuman.parent-> parent(->表示取消引用,然后是“。”)

答案 3 :(得分:-1)

您可以通过将指针属性保留在相同类型的类中来实现。 像

class Human {
...
...
public : Human* parent;
...
...
}

并且可以用作:

int main()
{
    Human* h1 = new Human;
    Human* h2 = new Human;

    h2->parent = h1;
    ...
    ...
    delete h1;
    delete h2;
}