【问题标题】:Operator "<<" overloading return type运算符“<<”重载返回类型
【发布时间】:2015-01-29 09:25:56
【问题描述】:

假设有一个 cPoint 类。

class cPoint {
  int x, y, z;
};

我想在一个语句中打印所有三个变量。所以,我重载了运算符

   friend std::ostream& operator<< (std::ostream &cout, cPoint &p);

   std::ostream& operator<< (std::ostream &out, cPoint &p) {
     out << p.get_x() << " " << p.get_y() << " " << p.get_z() << std::endl;
     return out;
   }

有意义吗?

我的问题在于插入运算符(>>)会发生什么。我还重载了它以将 x、y 和 z 的值放入单个语句中。

    friend std::istream& operator>> (std::istream &cin, Point &p);

    std::istream& operator>> (std::istream &in, Point &p) {
        int tmp;
        in >> tmp;
        p.set_x(tmp);
        in >> tmp;
        p.set_y(tmp);
        in >> tmp;
        p.set_z(tmp);
    }

清除?

int main() {
  cout << p << endl;
  cin >> p;
}

我知道如果 operator

但是如果是>>会发生什么。为什么我不能像这样为 >> 返回一个 void:

    void operator>> (std::istream &cin, Point &p);

因为 cin >> p 返回 void 或其他内容都没有关系。没有其他操作数可以使用它。这个不清楚。

【问题讨论】:

  • 顺便说一句,您应该使用 (std::ostream &amp;out, const cPoint &amp;p) 而不是 (std::ostream &amp;out, cPoint &amp;p) - 否则您会产生输出运算符修改其 cPoint 参数的印象。

标签: c++ c++11


【解决方案1】:

可以从提取operator &gt;&gt;的流中返回void,就像你可以从插入operator &lt;&lt;的流中返回void一样。就像插入的一样,它会阻止你进行链接:

cPoint p, q;
cin >> p >> q; // This would fail with return type void

...以及非常常见的测试正确性成语:

cPoint p;
if (cin >> p) {
}

【讨论】:

  • 同意。但就我而言,我没有为 cin 做任何链接。对吗?
  • 我在 cout 语句而不是 cin 语句中进行链接。 cout > p;
  • 正如我所说,您可以返回void。在你的情况下,你没有做任何链接,所以它会起作用。而且您没有进行任何验证,这是您应该做的,并且不适用于voidvoid 将阻止其他任何人进行链接或验证。所以返回void 是个坏主意(TM)。
  • 好吧。这就是我想听到的,它应该起作用。当我改变时:code friend std::istream&amp; operator&gt;&gt; (std::istream &amp;cin, Point &amp;p); TO code friend void operator&gt;&gt; (std::istream &amp;cin, Point &amp;p); AND code void operator&gt;&gt; (std::istream &amp;in, Point &amp;p) { code int tmp; code in &gt;&gt; tmp; code p.set_x(tmp); code in &gt;&gt; tmp; code p.set_y(tmp); code in &gt;&gt; tmp; code p.set_z(tmp); } 它甚至没有编译。
  • @HemantBhargava 它不能编译是问题中应该非常明确提到的信息。连同完整的错误消息和(理想情况下)minimal reproducing example 也是如此。
【解决方案2】:

我重载了operator &lt;&lt;,就像...

正确的覆盖应该通过const引用第二个参数:

friend std::ostream& operator<< (std::ostream &cout, const cPoint &p);
//                                                   ^^^^^

我还重载了它以将 x、y 和 z 的值放入单个语句中。

您忘记从实现返回in

std::istream& operator>> (std::istream &in, Point &p) {
    int tmp;
    in >> tmp;
    p.set_x(tmp);
    in >> tmp;
    p.set_y(tmp);
    in >> tmp;
    p.set_z(tmp);
    return in; <<== Here
}

将其设为void 会阻止您在同一行的该点之后阅读其他任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多