繁体   English   中英

C ++ :. cpp文件中的实例本身的表示关键字定义了类的功能

[英]C++: Representation keyword of the instance itself inside a .cpp file defining functions of a class

例如,我创建一个名为Circle的类,并在Circle.h对其进行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似乎已被弃用或具有其他含义?

您要寻找的关键字是this 它是在其上调用该函数的实例的指针。 在您的示例中,您将像这样使用它:

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

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

对于此类情况(在构造函数内部初始化数据成员),C ++具有初始化程序语法,通常比在构造函数主体中分配成员更可取。 代码如下所示:

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

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

parent = this;

但是,您确定要让圈子的父母成为自己吗? 通常,层次结构中最顶层的对象具有空的父指针:

parent = nullptr;

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

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

根据我阅读的资源,这似乎已被弃用或具有其他含义?

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

向后移动,您的难题的解决方案是使用this

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

这段代码几乎是正确的:

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

但是不是很正确,因为*parent取消了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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM