【问题标题】:What's the right way to overload the stream operators << >> for my class?为我的班级重载流运算符 << >> 的正确方法是什么?
【发布时间】:2010-02-28 17:59:48
【问题描述】:

我对如何在 C++ 中为我的类重载流运算符有点困惑,因为它们似乎是流类上的函数,而不是我的类上的函数。这样做的正常方法是什么?目前,对于“get from”操作符,我有一个定义

istream& operator>>(istream& is, Thing& thing) { // etc...

有效。 Thing 类的定义中没有提到它。我希望它能够在其实现中访问我的 Thing 类的成员 - 我该怎么做?

【问题讨论】:

    标签: c++ operator-overloading stream-operators


    【解决方案1】:

    你的实现很好。您需要执行的唯一额外步骤是在Thing 中将您的运算符声明为friend

    class Thing {
    public:
      friend istream& operator>>(istream&, Thing&);
      ...
    }
    

    【讨论】:

    • 谢谢。它不在“公共:”部分中是什么意思?
    【解决方案2】:

    其他答案是正确的。如果它对您有帮助,这里有一个代码示例 (source):

    class MyClass {
      int x, y;
    public:
      MyClass(int i, int j) { 
         x = i; 
         y = j; 
      }
      friend ostream &operator<<(ostream &stream, MyClass ob);
      friend istream &operator>>(istream &stream, MyClass &ob);
    };
    
    ostream &operator<<(ostream &stream, MyClass ob)
    {
      stream << ob.x << ' ' << ob.y << '\n';
    
      return stream;
    }
    
    istream &operator>>(istream &stream, MyClass &ob)
    {
      stream >> ob.x >> ob.y;
    
      return stream;
    }
    

    【讨论】:

    • 我将 operator
    【解决方案3】:

    你让你的 operator&gt;&gt; 成为 Thing 类的朋友。

    【讨论】:

      【解决方案4】:

      有几种方法,正确的方法实际上取决于类的作用。

      拥有允许读取信息的公共 API 通常是有意义的,在这种情况下,流媒体运营商不需要访问私有 API。

      可能最流行的方法是将流函数声明为类的朋友。

      我最喜欢的是提供一个公共的 Boost.Serialization 样式模板函数,它可以用于流式传输,也可以用于其他方面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-28
        • 2020-12-18
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        • 2016-03-24
        • 1970-01-01
        相关资源
        最近更新 更多