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
に選択した意味のある文字列表現を出力しますか?
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 理由 を参照してください。)
Erikのソリューションの代わりに、文字列変換演算子をオーバーライドできます。
class MyObj {
public:
operator std::string() const { return "Hi"; }
}
このアプローチを使用すると、文字列出力が必要な場所でオブジェクトを使用できます。ストリームに制限されません。
ただし、このタイプの変換演算子は、意図しない変換やトレースが困難なバグを引き起こす可能性があります。 Path
、UserName
、SerialCode
などのテキストセマンティクスを持つクラスのみでこれを使用することをお勧めします。
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;
};
演算子のオーバーライドはニースの解決策ですが、次のような単純なものにも慣れています(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;
}