C++中的toString重载

45

在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
那里不应该使用new动态分配对象(这样做无法编译)。 - sth
4
在 C++ 中,可以使用以下两种方式之一:Object* x = new Object(); cout << *x;Object x; cout << x; - Vlad
4个回答

65
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++超级FAQ中关于为什么要使用非成员内联函数的解释)。

19
请注意,这部分不在类/结构体中! - Martin Thoma
1
@jalf在SO上关于C++内联函数的回答似乎比FAQ更清楚地解释了为什么要在头文件中标记函数定义为内联。- https://dev59.com/hm445IYBdhLWcg3wE2Je#5057179 - jla
我得到了一个错误:二进制运算符“<<”有太多参数。 - Nathan B

41

除了Erik的解决方案,你也可以覆盖字符串转换运算符。

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

使用这种方法,您可以在需要字符串输出的任何地方使用您的对象。您不受流的限制。

但是这种类型的转换操作符可能会导致无意识的转换和难以跟踪的错误。我建议仅对具有文本语义的类(例如 PathUserNameSerialCode)使用此方法。


3
然而,像这样的隐式转换运算符可能会导致令人不愉快的意外。 - aschepler
1
最好同时定义两者,并让ostream& operator<<使用string运算符。另外,我会将string运算符重命名为类似于ToString()成员函数的名称,保留字符串转换为字符串对象的情况。 - Vlad
1
避免在非直接相关类型中使用隐式转换运算符。如果在不能有意义地转换为特定类型的类型上使用,它们往往会成为一些非常难以找到的错误的源头。 - Zac Howland
点数已经被记录并添加到答案中。 - Tugrul Ates

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

3
尽管操作符重载是一个不错的解决方案,但我更喜欢以下更简单的方法(似乎也更符合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;
}

1
当您使用std::cout << myClassInst;时,此函数不会被调用。 - Ryan Bemrose
2
正如我所说 - 更可能是Java ... 即:它用于像这样的用法: printf("myClassInst = %s\n", myClassInst.toString() ) ; 或者像这样: std::cout << myClassInst.toString() ; - Touhid
这个存在内存泄漏 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接