【问题标题】:How can I use cout << myclass如何使用 cout << myclass
【发布时间】:2021-07-25 11:00:22
【问题描述】:

myclass是我写的一个C++类,我写的时候:

myclass x;
cout << x;

如何输出1020.2,例如integerfloat 值?

【问题讨论】:

    标签: c++ class input integer


    【解决方案1】:

    通常为您的班级重载operator&lt;&lt;

    struct myclass { 
        int i;
    };
    
    std::ostream &operator<<(std::ostream &os, myclass const &m) { 
        return os << m.i;
    }
    
    int main() { 
        myclass x(10);
    
        std::cout << x;
        return 0;
    }
    

    【讨论】:

    • 请注意,如果myclass 有任何private 字段,并且您希望operator&lt;&lt;() 输出它们,则myclass 应将std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, myclass const&amp;) 声明为朋友。
    • 不应该是const myclass &amp;m 而不是myclass const &amp;m吗?
    • @Nubcake:不。就编译器而言,两者的含义相同,但我仍然认为前缀形式是错误的。要阅读 C++ 声明,请从声明的内容开始,然后向外工作,在类型后面加上 const,它表示:m is a reference to a const myclass。在类型之前加上它,它说“m 是对 myclass const` 的引用,它正好在无意义和真正不合语法之间的参差不齐的边缘。
    • 对于任何像我一样困惑的人,将重载运算符放在类定义的之外(就像在示例中一样)。
    • @Lorenzo:不,它不能是成员函数。有关详细信息,请参阅stackoverflow.com/a/9814453/179910
    【解决方案2】:

    你需要重载&lt;&lt;操作符,

    std::ostream& operator<<(std::ostream& os, const myclass& obj)
    {
          os << obj.somevalue;
          return os;
    }
    

    然后,当您执行cout &lt;&lt; x(在您的情况下x 的类型为myclass)时,它会输出您在方法中告诉它的任何内容。在上面的示例中,它将是x.somevalue 成员。

    如果成员的类型不能直接添加到ostream,那么您还需要使用与上述相同的方法为该类型重载&lt;&lt; 运算符。

    【讨论】:

    • 这是左移运算符,而不是“流运算符”。在 Iostreams 的上下文中,它要么是插入运算符,要么是提取运算符,但绝不是流运算符。
    • 对不起,你是对的。这正是我在脑海中所称的,因为我倾向于仅在处理流时使用它。在这种情况下,它将是您所说的插入运算符,而不仅仅是流运算符。我已经更新了我的答案以删除该位。
    【解决方案3】:

    这很容易,只需实施:

    std::ostream & operator<<(std::ostream & os, const myclass & foo)
    {
       os << foo.var;
       return os;
    }
    

    您需要返回对 os 的引用才能链接输出 (cout

    【讨论】:

      【解决方案4】:

      即使其他答案提供了正确的代码,也建议使用隐藏的朋友功能来实现operator&lt;&lt;。隐藏的友元函数的范围更有限,因此编译速度更快。由于使命名空间范围混乱的重载较少,编译器要做的查找也较少。

      struct myclass { 
          int i;
      
          friend auto operator<<(std::ostream& os, myclass const& m) -> std::ostream& { 
              return os << m.i;
          }
      };
      
      int main() { 
          auto const x = myclass{10};
          std::cout << x;
      
          return 0;
      }
      

      【讨论】:

      • “隐藏”是什么意思?我可以看到函数,所以它隐藏得不是很好。
      • @NathanOliver 这个名字是从p1601 借来的。这应该以不同的方式调用吗?
      • 不,没关系。我以前从未听说过这个词。看了沃尔特的论文,觉得更有意义了。
      【解决方案5】:

      替代方案:

      struct myclass { 
          int i;
          inline operator int() const 
          {
              return i; 
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2011-01-16
        • 2013-06-12
        • 2022-01-24
        • 1970-01-01
        • 2011-05-08
        • 2014-10-11
        • 2019-02-01
        • 1970-01-01
        相关资源
        最近更新 更多