web-dev-qa-db-ja.com

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に選択した意味のある文字列表現を出力しますか?

34
Aillyn
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 理由 を参照してください。)

52
Erik

Erikのソリューションの代わりに、文字列変換演算子をオーバーライドできます。

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

このアプローチを使用すると、文字列出力が必要な場所でオブジェクトを使用できます。ストリームに制限されません。

ただし、このタイプの変換演算子は、意図しない変換やトレースが困難なバグを引き起こす可能性があります。 PathUserNameSerialCodeなどのテキストセマンティクスを持つクラスのみでこれを使用することをお勧めします。

31
Tugrul Ates
 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
Parsa Jamshidi

演算子のオーバーライドはニースの解決策ですが、次のような単純なものにも慣れています(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;
}
2
Touhid