【发布时间】:2019-02-18 14:54:25
【问题描述】:
我用 C++ 编写了一个简单的二叉树类,并想向它添加一个输出运算符。我的第一次尝试是:
ostream& operator<<(ostream& out, const Tree& tree) {
out << tree.myData;
if (tree.myLeft)
out << "(" << (*tree.myLeft) << ")";
if (tree.myRight)
out << "[" << (*tree.myRight) << "]";
return out;
}
(其中 myLeft 和 myRight 分别是指向当前树的左右子节点的指针)。这可以正常工作,但是它不够酷,因为它跨越了几行并且需要多次写入“out
为了尝试创建一个单行运算符,我写了这个:
ostream& operator<<(ostream& out, const Tree& tree) {
return (out << tree.myData
<< "(" << (tree.myLeft? *tree.myLeft: "") << ")"
<< "[" << (tree.myRight? *tree.myRight: "") << "]");
}
但是,这会产生错误:
不兼容的操作数类型('Tree' 和 'const char [1]')
所以我尝试了这个:
ostream& operator<<(ostream& out, const Tree& tree) {
return (&tree?
out << tree.myData
<< "(" << *(tree.myLeft) << ")"
<< "[" << *(tree.myRight) << "]":
out);
}
这适用于我的计算机,但会生成一条警告,暗示这是未定义的行为:
在定义良好的 C++ 代码中,引用不能绑定到取消引用的空指针;可以假定指针总是转换为真 [-Wundefined-bool-conversion]
问题:有没有办法在一个简单的语句中编写这个输出运算符?
【问题讨论】:
-
This works correctly, however, it is not sufficiently cool, since it spans several lines and requires to write "out << " several times.为什么这很重要?您只需编写一次函数,然后只需在实际代码中执行out << Tree;。 -
我问你的问题:你为什么要做这样的事情?你的第一个代码块清晰、简洁、易于维护,几乎不需要脑力就能理解。这就是你应该默认编写的那种代码。
-
@NathanOliver 这不是用于生产的代码 - 它是用于学习的。由于我尝试编写单行代码,我已经了解了关于 C++ 的两个新内容:三元运算符需要兼容的数据类型,以及取消引用空指针被定义为未定义的行为。两者都让我感到非常惊讶。现在,我很好奇 c++ 是否还有另一个惊喜可以解决这个难题。
标签: c++ output binary-tree