【问题标题】:How do I use "this" in a member function?如何在成员函数中使用“this”?
【发布时间】:2011-02-15 06:09:50
【问题描述】:

我写了一个 Node 类的成员函数来按后缀顺序读取节点树。

它将被树的根节点Node实例调用。

所以:N.postfix();

这些似乎是非法的:

*this->left.postfix();
*this->right.postfix();

这样做的正确方法是什么?

class Node
{
public:
    const char *cargo; 
    int depth; 
    Node *left; 
    Node *right

void Node::postfix()
{
    if (this==__nullptr)
    {
        return;
    }
    else
    {
        *this->left.postfix();
        *this->right.postfix();
        out<<*this->cargo<<"\n";
        return;
    }
};

【问题讨论】:

  • 如果this==__nullptr,为什么要默默返回?如果这是真的,你的程序有一些非常严重的问题
  • @Peter - 尽管在大多数情况下这可能会起作用,但实际上您正在做一些非常糟糕的事情。在空指针上调用成员函数是 UB。它恰好在这种特殊情况下起作用,因为大多数实现都像“postfix(Node * n)”一样工作并且比较n == 0不会做任何坏事。但它不一定要工作,有时可能会失败。
  • 我会告诫不要使用 this==__nullptr。调用空指针的成员函数会导致 C++ 规范中未定义的行为。我会使用 if (left != __nullptr) { left->postfix(); } 而不是
  • 要回应@Noah 所说的,您需要在调用成员函数之前检查leftright 是否指向有效对象。调用成员函数,然后测试this是否为null是倒退不正确的;尽管它看起来可以正常工作,但它永远不会正常工作。
  • 您不必将其设为非成员函数 - 只需使用 Akusete 的建议,并在调用其成员之前检查指针不为空。

标签: c++


【解决方案1】:

在成员函数中,一般不需要使用this来访问类成员;你可以简单地使用:

left->postfix();

等等

如果你有函数参数或其他与类成员变量同名的局部变量,可以使用this来引用成员变量,例如,

this->left->postfix();

您的代码非法的原因是它没有正确地将left 视为指针。您需要使用 -&gt; 取消引用 left 才能访问其成员,如此处正确代码所示。 (您也可以使用等效的 (*left).postfix(),但这只会让您使用更多的括号并没有真正的好处。)

在表达式开头使用间接运算符* 也是不正确的,因为它应用于postfix() 的结果(即,它取消引用postfix() 返回的任何内容)。 postfix() 没有返回任何东西,所以这是一个错误。请务必记住,.-&gt; 运算符的优先级都高于 *

【讨论】:

    【解决方案2】:

    -&gt; 运算符取消引用指针,因此额外的* 会导致问题。你可以这样做:

    this->left->postfix();
    

    或者这个:

    (*this).left->postfix();
    

    【讨论】:

    • 感谢您的编辑...我玩得不够仔细。
    【解决方案3】:
    
    *this->left.postfix();
    

    “取消引用 this 'left' 成员变量调用 postfix() 的返回值。”

    
    this->left->postfix();
    //or
    (*this->left).postfix();
    

    "在 this 的取消引用的 'left' 成员变量上调用 postfix()。"

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多