例如,我创建了一个名为 Circle
的类,并在 Circle.h
中定义它。
class Circle {
public:
Circle *parent;
Circle();
};
在与Circle.h
相同的目录下的一个单独的Circle.cpp
文件中,我定义了构造函数。
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
的编译器中,使用 NULL
或 0
。
由于您没有初始化 parent
指针以指向任何有效的 Circle
对象,因此当您取消引用它时,您的代码会调用未定义的行为。然后,您尝试将类型Circle*
的对象分配给类型为Circle
的对象,编译器会抱怨该对象。
根据我阅读的资源,这似乎已被弃用或已 变成其他含义?
您要么正在阅读不良资源,要么误读它们。 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;
}
与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
}