创建一个带有ostream引用并打印到它的函数的正确方法是什么?

时间:2016-10-24 22:35:00

标签: c++ ostream

正如标题所述,我正在尝试创建一个带有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>

2 个答案:

答案 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;