回答:
C ++では、あなたは、オーバーロードすることができoperator<<
ためostream
、カスタムクラス:
class A {
public:
int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.i << ")";
}
これにより、クラスのインスタンスをストリームに出力できます。
A x = ...;
std::cout << x << std::endl;
場合は、あなたのoperator<<
欲求は、クラスの内部をプリントアウトするA
と、本当にあなたはまた、フレンド関数として宣言でき、その秘密と保護されたメンバーにアクセスする必要があります。
class A {
private:
friend std::ostream& operator<<(std::ostream&, const A&);
int j;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.j << ")";
}
friend
、それをとして宣言し、クラスの本体の内部でも-これを使用すると、using namespace
演算子(およびクラス)を含む名前空間を指定する必要はありませんが、ADLは、そのクラスのオブジェクトが存在する限り、それを見つけますオペランドの1つ。
dump
パブリックメソッドはダーティで不要です。friend
ここでの使用は完全に問題ありません。この正確な目的のために導入されたとはfriend
いえ、冗長な方法と侵入型のどちらを好むかは、完全に好みの問題ですfriend
。
operator<<()
メンバー関数を作成しても機能しません。std::ostream
型の左側のオペランドを受け入れるには、メンバー関数をのメンバー関数にする必要がありますstd::ostream
。
このようにして、ポリモーフィズムを許可することもできます。
class Base {
public:
virtual std::ostream& dump(std::ostream& o) const {
return o << "Base: " << b << "; ";
}
private:
int b;
};
class Derived : public Base {
public:
virtual std::ostream& dump(std::ostream& o) const {
return o << "Derived: " << d << "; ";
}
private:
int d;
}
std::ostream& operator<<(std::ostream& o, const Base& b) { return b.dump(o); }
toString
動作をコピーします。
C ++ 11では、最終的にto_stringが標準に追加されました。
http://en.cppreference.com/w/cpp/string/basic_string/to_string
ToString()
は、はすべてのオブジェクトの基本クラスで定義される仮想関数であるため、任意のオブジェクトの文字列表現を表現する標準的な方法として使用されます。これらの関数はstd::string
、組み込み型にのみ適用されます。C ++での慣用的な方法は<<
、カスタム型の演算子をオーバーライドすることです。
operator<<
単純なString
セマンティクスと比較して 、to_string()
「有用な追加」であるだけでなく、C ++でそれを行うための新しい推奨される方法であることに気付かされます。OPのように、クラスのカスタム文字列表現A
が必要な場合は、string to_string(A a)
以下の定義でclass A
十分です。これは、Javaの場合と同様に継承で伝播し、Javaの場合と同様に(文字列の追加によって)組み合わせることができます。toString()
Javaでオーバーライドされないものは、とにかく使用が制限されています。
Johnの発言の拡張として、文字列表現を抽出してそれをstd::string
doに格納する場合は、次のようにします。
#include <sstream>
// ...
// Suppose a class A
A a;
std::stringstream sstream;
sstream << a;
std::string s = sstream.str(); // or you could use sstream >> s but that would skip out whitespace
std::stringstream
配置されている<sstream>
ヘッダ。
質問に答えました。しかし、私は具体的な例を追加したかった。
class Point{
public:
Point(int theX, int theY) :x(theX), y(theY)
{}
// Print the object
friend ostream& operator <<(ostream& outputStream, const Point& p);
private:
int x;
int y;
};
ostream& operator <<(ostream& outputStream, const Point& p){
int posX = p.x;
int posY = p.y;
outputStream << "x="<<posX<<","<<"y="<<posY;
return outputStream;
}
この例では、オペレーターのオーバーロードを理解する必要があります。