C ++:实例本身的表示关键字,位于定义类的函数的.cpp文件中

时间:2012-11-29 14:51:00

标签: c++ class instance keyword

例如,我创建了一个名为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 = ????
}

我应该在????部分填写什么内容?在AS3中,我知道在定义类的功能时,您可以使用this关键字来表示实例本身。你在C ++中使用了什么?

编辑2012/11/29 23:56

还有另一个构造函数:

Circle(Circle*);

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

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

void addChild();

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

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

parent = this;

但是,你确定你想要圆圈的父母本身吗?通常,层次结构中最顶层的对象具有空父指针:

parent = nullptr;

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

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

答案 2 :(得分:0)

  

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

你要么正在阅读不良资源,要么误读它们。 this指针在C ++(03 | 11)中运行良好。

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

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

这段代码几乎是正确的:

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

但不太正确因为*parent解除引用parent,这不是你想要做的。您要做的是分配parent指针,而不是对parent指向的事物进行更改:

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

Simalarly与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
}