【问题标题】:C++: Representation keyword of the instance itself inside a .cpp file defining functions of a classC ++:定义类函数的.cpp文件中实例本身的表示关键字
【发布时间】:2012-11-29 14:51:00
【问题描述】:

例如,我创建了一个名为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 似乎已被弃用或已成为其他含义?

【问题讨论】:

  • 为什么需要parent 指向它自己?这就是this 的用途。
  • 父 = 这个;工作......如果这是你需要的。
  • @JohnDibling - class 在标题中定义;它的非内联成员函数在源文件中定义。
  • @ThePluc:这不是 OP 需要的。它没有任何用处。
  • 对不起,我没有说清楚。我有另一个函数创建一个新的Circle 实例并将*parent 设置为函数调用者。你会在我的编辑中看到。

标签: c++ class instance keyword


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢,成功了!所以你的意思是this它自己是一个指向实例本身的指针,对吧?
  • @GreekFellows 是的,完全正确。而且它绝对不会被弃用。
  • 我什至会声称:它永远不会被弃用。 8^)
  • 谢谢,对不起。我是 C++ 新手,学到了很多东西。 this 关键字是否只允许在定义类的函数时使用?
  • @GreekFellows 不要抱歉。很好,你正在学习。是的,this 仅在非静态成员函数的定义内有效。在其他上下文中,没有“调用函数的实例”,因此它没有明确定义的含义。
【解决方案2】:

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

parent = this;

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

parent = nullptr;

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

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

【讨论】:

  • 根据预期的解释,层次结构中最顶层的对象很可能将自己作为父对象。这里的 parent 可以是一个包含这个的圆圈*this 符合要求。
  • 补充@Walter 所说的,实现链表的一种方法是让端节点包含指向自身的指针。对列表的迭代一直持续到next == this。这种方法的好处是取消引用next 具有明确定义的行为,无需检查空指针。
  • @Walter 当然,这就是我给出第一个解决方案的原因。考虑到提问者可能做错事的可能性,我认为值得指出常见情况。编辑使其不“奇怪”。
  • 由于头文件中的一些其他代码,我将圆圈本身分配给其父级。
【解决方案3】:

根据我阅读的资源,这似乎已被弃用或已 变成别的意思了吗?

您要么阅读不良资源,要么误读它们。 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
}

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2022-07-26
    • 1970-01-01
    相关资源
    最近更新 更多