【问题标题】:toString override in C++ [duplicate]C ++中的toString覆盖[重复]
【发布时间】:2011-07-07 12:04:37
【问题描述】:

在 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 选择的有意义的字符串表示形式吗?

【问题讨论】:

  • 你不应该用new动态分配对象(它不会编译)。
  • 在 C++ 中,使用 Object* x = new Object(); cout &lt;&lt; *x;Object x; cout &lt;&lt; x;

标签: c++ tostring


【解决方案1】:
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 &amp; operator&lt;&lt;(...(参见 C++ Super-FAQ for why。)

【讨论】:

  • 注意这部分不在类/结构中!
  • @jalf 在 SO 上的标题中关于 C++ 内联函数的答案似乎比常见问题解答更清楚地回答了为什么要在内联标题中标记函数定义。 - stackoverflow.com/a/5057179/101151
  • 我得到错误:二进制'操作符
【解决方案2】:

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

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

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

但是,这种类型的转换运算符可能会导致意外转换和难以跟踪的错误。我建议仅将其用于具有文本语义的类,例如 PathUserNameSerialCode

【讨论】:

  • 但是,像这样的隐式转换运算符可能会导致令人不快的意外。
  • 最好同时定义两者,并让ostream&amp; operator&lt;&lt; 使用string 运算符。我要做的另一件事是将string 运算符重命名为ToString() 成员函数,为对象本身是字符串的情况保留字符串转换。
  • 避免非直接相关类型的隐式转换运算符。如果将它们用于无法有意义地转换为特定类型的类型,它们往往会成为一些非常难以发现的错误的根源。
  • 分数并添加到答案中。
【解决方案3】:
 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;
 };

【讨论】:

    【解决方案4】:

    虽然运算符重载是一个不错的解决方案,但我对以下更简单的方法感到满意(这似乎更可能是 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;
    }
    

    【讨论】:

    • 当你使用std::cout &lt;&lt; myClassInst;时这个函数不会被调用
    • 正如我所说 - 它更可能是 Java ......即:它的用法如下:printf("myClassInst = %s\n", myClassInst.toString() ) ; 或类似:std::cout &lt;&lt; myClassInst.toString() ;
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多