【发布时间】: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 所说的,您需要在调用成员函数之前检查
left和right是否指向有效对象。调用成员函数,然后测试this是否为null是倒退不正确的;尽管它看起来可以正常工作,但它永远不会正常工作。 -
您不必将其设为非成员函数 - 只需使用 Akusete 的建议,并在调用其成员之前检查指针不为空。
标签: c++