正如标题所述,我正在尝试创建一个带有ostream引用并打印到它的函数。上下文是二进制搜索树的上下文。
我对ostream没有太多经验,我之前只使用过一次(大约3周前才开始学习c ++),这是基于运算符的基本模板示例<<我在谷歌上发现的重载。
由于我的理解有限,我不确定如何使用我创建的函数来实现它。
这是我迄今为止基于我的有限知识所尝试的,
我首先创建了引用void write(std::ostream &out) const;
然后我尝试创建函数
std::ostream& write(std::ostream &out,node& o){
out << o.leftChild<< " " << o.val << " " << o.rightChild;
return out;
}
即。 o.leftChild和o.rightChild应该打印节点的结果。 o.val只是节点中的数据。
预期结果应该类似于1 2 3 4.但是,如果我尝试按照上面的方式使用引用,我的IDE会收到一条错误消息,指出 write 未实施。
但是,如果我将引用作为方法编写,则结果将返回为空白。
UPDATE:删除了我认为是引用的内容,我不再收到任何错误消息。
但是结果仍为零,我认为这是因为我的实现不正确。
UPDATE2: 我想要准确尝试的是将打印功能打印到它,
在左子项上调用write的结果,后跟一个空格,来自节点的数据,一个空格以及在右子项上调用write的结果(如果有的话)。
此段的所有先前代码我已按预期工作。对于变量,data
是模板参数类型(T
),左右孩子是unique_ptr<node>
。
答案 0 :(得分:0)
首先:void write(std::ostream &out) const;
不是参考。它是一个函数的声明。
第二:在声明结束时从const
判断它是类内的方法。然后你必须在定义类体外的方法时使用范围运算符(::
)。
至于“空白结果”,没有更多代码就无法说出来。
答案 1 :(得分:0)
您的第一个write()
声明声明了一个类中的方法(可能是node
类),但您没有实现该方法的 body 。这就是编译器所抱怨的。
你的第二个write()
正在实现一个独立函数的主体,而不是类方法。
尝试更像这样的东西:
class node {
...
public:
...
void write(std::ostream &out) const;
};
void node::write(std::ostream &out) const {
if (leftChild) {
leftChild->write(out);
out << " ";
}
out << val;
if (rightChild) {
out << " ";
rightChild->write(out);
}
}
然后可以这样使用:
node n;
...
n.write(std::cout);
unique_ptr<node> n(...);
...
n->write(std::cout);
如果你想实现一个独立的功能,它看起来会更像这样:
class node {
...
public:
...
void write(std::ostream &out) const;
};
std::ostream& write(std::ostream &out, const node &n);
void node::write(std::ostream &out) const {
...
}
std::ostream& write(std::ostream &out, const node &n) {
n.write(out);
return out;
}
然后可以这样使用:
node n;
...
write(std::cout, n);
unique_ptr<node> n(...);
...
write(std::cout, *n);
然后您可以通过将独立功能更改为自定义operator<<
来更进一步:
class node {
...
public:
...
void write(std::ostream &out) const;
};
std::ostream& operator<<(std::ostream &out, const node &n);
void node::write(std::ostream &out) const {
if (leftChild)
out << *leftChild << " ";
out << val;
if (rightChild)
out << " " << *rightChild;
}
std::ostream& operator<<(std::ostream &out, const node &n) {
n.write(out);
return out;
}
node n;
...
std::cout << n;
unique_ptr<node> n(...);
...
std::cout << *n;