ユーザー定義オブジェクトを印刷する方法に興味があります。つまり、オブジェクトを出力ストリームに印刷することを意味します。JavaのObject型がすべての派生クラスにtoString()メソッドを提供するのと同様に、ストリームクラスにすべての種類のオブジェクトを出力できるメソッドを提供させることは可能ですか?1つの問題は、ストリームクラスから派生できるクラスがないことだと思います。JavaのObjectの例では、すべてのクラスが暗黙的にObjectのサブクラスであるためです。他にありますか?
6 に答える
これはC++とタグ付けされているので、C++の答えは次のとおりです。
std::ostream& operator<<(std::ostream&, const foo& f)
次のようなことをしてオーバーロードするだけです。
class foo {
friend std::ostream& operator<<(std::ostream& os, const foo& f) {
return os << f.x;
}
public:
// ...
private:
int x;
};
int main() {
foo myfoo;
std::cout << "myfoo is " << myfoo << '\n';
}
これを行う方法については、はるかに優れたガイドがあります。
関数をオーバーライドしてtoString()
呼び出します。あらゆる種類のオブジェクトを単純に印刷する神クラスをどのように作成できるかわかりません。
すべての種類のオブジェクトをストリーミングすることはできません。たとえば、スレッドをどのようにストリーミングしますか?これはどういう意味ですか?
@Aidancの回答はうまくいく可能性があります。すべてはあなたが何をしたいかに依存します。オブジェクトフィールドをコンソールに出力する場合は、それが解決策です。
ただし、たとえば、人間がストリームを読み取らずにネットワーク経由で送信する場合は、ObjectOutputStreamを使用します。ソケットまたはファイルのいずれかであるかどうかに関係なく、ストリームとの間でオブジェクトを書き込む(およびObjectInputstreamを読み取る)ことができます。
ほとんどすべてのオブジェクトをそのように送信できます。Serializableを実装する人は、自分でシリアル化(オブジェクトを0と1のシーケンスに変換する)を担当します。その他の場合は、ExternalizableApiを引き続き使用できます。
あなたは2つのことを見たいです:
- Javaクラスオブジェクト
- Javaリフレクションの概念
基本的に、両方の組み合わせにより、任意のオブジェクトを内省できるため、オブジェクトを希望どおりに印刷するための一般的な方法を簡単に思い付くことができます。つまり
String myClassName = "com.my.class.NameHere";
Class c = Class.forName(myClassName);
Method m[] = c.getDeclaredMethods();
for(Method method: m)
System.out.println(method.toString());
Pubbyの答えをいくらか拡張するoperator<<
と、わずかな変更を加えるだけで、すべてのストリームタイプで関数を機能させることができます。でストリーミングする方法もここに示されています。
class foo {
//output works for all basic_ostreams
template<class e, class t>
friend std::basic_ostream<e,t>&
operator<<(std::basic_ostream<e,t>& os, const foo& f)
{
return os << f.x;
}
//input is very similar. Here's the differences:
// istream instead of ostream
// >> instead of <<
// foo is not const
template<class e, class t>
friend std::basic_istream<e,t>&
operator>>(std::basic_istream<e,t>& is, foo& f)
{
return os >> f.x;
}
public:
// ...
private:
int x;
};
int main() {
foo myfoo;
std::cout << "enter foo: ";
std::cin >> myfoo;
std::cout << "myfoo is " << myfoo << '\n';
std::wcout << L"myfoo is " << myfoo << L'\n';
}