C ++中的toString覆盖

时间:2011-03-02 18:28:02

标签: c++ tostring

在Java中,当一个类覆盖.toString()而你执行System.out.println()时,它将使用它。

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

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

Object x = new Object();
std::cout << *x << endl;

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

4 个答案:

答案 0 :(得分:52)

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

如果你在头文件中写这个,请记住将内联函数标记为:inline std::ostream & operator<<(...(参见C ++ Super-FAQ for why。)

答案 1 :(得分:31)

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

class MyObj {
public:
    operator std::string() const { return "Hi"; }
}

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

然而,这种类型的转换运算符可能会导致无意的转换和难以跟踪的错误。我建议仅使用具有文本语义的类,例如PathUserNameSerialCode

答案 2 :(得分:4)

 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;
 };

答案 3 :(得分:2)

虽然运算符覆盖是一个很好的解决方案,但我对以下更简单的东西感到满意(这似乎也更像是Java):

char* MyClass::toString() {
    char* s = new char[MAX_STR_LEN];
    sprintf_s(s, MAX_STR_LEN, 
             "Value of var1=%d \nValue of var2=%d\n",
              var1, var2);
    return s;
}