0

例如,我创建了一个名为的类并将Circle其定义在Circle.h.

class Circle {
    public:
        Circle *parent;

        Circle();
};

Circle.cpp在与 相同目录下的一个单独文件中Circle.h,我定义了构造函数。

Circle::Circle() {
    // creates a root circle, parent is set to itself
    *parent = ????
}

我应该填写什么????this在 AS3 中,我知道在定义类的函数时可以使用关键字来表示实例本身。你在 C++ 中使用什么?

编辑 2012/11/29 23:56

还有另一个构造函数:

Circle(Circle*);

Circle::Circle(Circle *cParent) {
    *parent = *cParent;
}

一个函数在被调用时会创建一个新Circle实例并将新实例设置*parent为调用者。

void addChild();

void Circle::addChild() {
    Circle child(????);
}

????仍然是那个神秘的部分。根据我读过的资源,this似乎已被弃用或已成为其他含义?

4

3 回答 3

2

您要查找的关键字是this; 它是一个指向调用函数的实例的指针。在您的示例中,您将像这样使用它:

Circle::Circle()
{
  parent = this;
}

请注意,它必须是parent = this;不是 *parent = this;。后者将分配给parent指向的对象,这是无效的(parent具有不确定的值)。幸运的是,它不会编译,因为您将指针分配给对象。

对于这种情况(在构造函数中初始化数据成员),C++ 具有初始化语法,这通常优于在构造函数主体中分配成员。代码将如下所示:

Circle::Circle()
  : parent(this)
{}
于 2012-11-29T14:55:56.593 回答
1

同样,在 C++ 中,this关键字是指向当前对象的指针。由于它是一个指针,因此您应该直接分配给parent指针而不是取消引用它。

parent = this;

但是,您确定要自己圈子的父级吗?通常,层次结构中最顶层的对象有一个空父指针:

parent = nullptr;

或者在不支持的编译器中nullptr,使用NULL0

由于您没有将parent指针初始化为指向任何有效Circle对象,因此当您取消引用它时,您的代码会调用未定义的行为。然后,您尝试将 type 的对象分配给 typeCircle*的对象Circle,您的编译器会抱怨。

于 2012-11-29T14:55:29.010 回答
0

根据我读过的资源,这似乎已被弃用或已成为其他含义?

您要么阅读不良资源,要么误读它们。指针在 C++(03|11)中this仍然有效。

向后移动,您的神秘解决方案是使用this

void Circle::addChild() {
    Circle child(this);
}

这段代码几乎是正确的:

Circle::Circle(Circle *cParent) {
    *parent = *cParent;
}

但不完全正确,因为*parentdereferences parent,这不是你想要做的。您要做的是分配parent指针,而不是更改parent指向的内容:

Circle::Circle(Circle *cParent) {
    parent = cParent;
}

与ctor类似:

Circle::Circle() {
    // creates a root circle, parent is set to itself
    parent = ????
}

但是在这种情况下,由于根节点在概念上没有父节点,因此parent该节点的成员不应指向自身,而应不指向任何内容:

Circle::Circle() {
    // creates a root circle, parent is set to itself
    parent = NULL; // or '0' or 'nullptr' with C++11
}
于 2012-11-29T15:06:17.920 回答