C++中的toString覆盖

Ail*_*lyn 36 c++ tostring

在Java中,当一个类重写.toString()并且你这样做System.out.println()时会使用它.

class MyObj {
    public String toString() { return "Hi"; }
}
...
x = new MyObj();
System.out.println(x); // prints Hi
Run Code Online (Sandbox Code Playgroud)

如何在C++中实现这一点,以便:

Object x = new Object();
std::cout << *x << endl;
Run Code Online (Sandbox Code Playgroud)

会输出一些我选择的有意义的字符串表示Object吗?

Eri*_*rik 52

std::ostream & operator<<(std::ostream & Str, Object const & v) { 
  // print something from v to str, e.g: Str << v.getX();
  return Str;
}
Run Code Online (Sandbox Code Playgroud)

如果你在头文件中写这个,记得将内联函数标记为:( inline std::ostream & operator<<(... 请参阅C++ Super-FAQ 了解原因.)

  • 请注意,此部分不在类/结构中! (15认同)

Tug*_*tes 31

作为Erik解决方案的替代方案,您可以覆盖字符串转换运算符.

class MyObj {
public:
    operator std::string() const { return "Hi"; }
}
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以在需要字符串输出的任何位置使用对象.您不仅限于流.

但是,这种类型的转换运算符可能会导致无意的转换和难以跟踪的错误.我建议只使用具有文本语义的类,例如a Path,a UserName和a SerialCode.

  • 但是,像这样的隐式转换运算符可能会导致令人不快的意外. (3认同)

Par*_*idi 6

 class MyClass {
    friend std::ostream & operator<<(std::ostream & _stream, MyClass const & mc) {
        _stream << mc.m_sample_ivar << ' ' << mc.m_sample_fvar << std::endl;
    }

    int m_sample_ivar;
    float m_sample_fvar;
 };
Run Code Online (Sandbox Code Playgroud)