2012-04-26 7 views
0

ユーザー定義オブジェクトを印刷する方法が不思議です。これにより、オブジェクトを出力ストリームに出力することを意味します。ストリームクラスで、JavaのObject型がすべての派生クラスに対してtoString()メソッドを提供する方法と同様に、あらゆる種類のオブジェクトを出力できるメソッドを提供することは可能ですか? JavaのObjectの例では、すべてのクラスがObjectの暗黙のサブクラスであるため、ストリームクラスからクラスを派生させることができないという問題があると思います。他にはありますか?ユーザー定義オブジェクトを印刷する方法

+1

待ち、あなたは私たちがJavaの 'のtoString()'をどうのようにC++でオブジェクトを印刷する方法を知りたい、またはあなたが両方の言語でオブジェクトを印刷する方法を知りたい、またはあなたが何を求めていますか? –

答えて

1

toString()関数をオーバーライドして呼び出します。単にあらゆる種類のオブジェクトを印刷する神のクラスをどのように持つことができるのか分かりません。

+0

フラグで判断すると、彼はC++で印刷する方法を知りたいと思うと思います –

0

すべての種類のオブジェクトをストリーミングすることはできません。たとえば、スレッドをどのように流すのですか?これはどういう意味ですか?

0

@Aidanc回答が働く可能性があります。すべてはあなたが何をしたいかによって決まります。オブジェクトフィールドをコンソールに印刷する場合は、それが解決策です。

しかし、ストリームを人間が読まずにネットワーク経由で送信する場合は、ObjectOutputStreamを使用します。オブジェクトは、ソケットまたはファイルのいずれかであっても、ストリームとの間でオブジェクトを書き込み(およびObjectInputstreamが読み取ることができます)ことができます。

ほとんどすべてのオブジェクトをそのように送ることができます。Serializableを実装する人は、自分自身でシリアル化(オブジェクトを0と1のシーケンスに変換する)を担当し、その他の場合はExternalizable APIを使用できます。

+0

フラグで判断すると、彼はC++で印刷する方法を知りたいと思うと思います –

0

あなたは2つのことを見てみたい:Javaの反射

の概念は基本的に両方の組み合わせは、あなたがそう任意のオブジェクトに内省することができます

  1. Javaクラスオブジェクト
  2. あなたが望むようにオブジェクトを印刷するための一般的な方法を思い付くのはかなり簡単です。私。

    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'; 
    } 
    

    はるかに優れたガイドがそこにこれを行う方法のがあります。このような何かをやって

    だけ過負荷std::ostream& operator<<(std::ostream&, const foo& f):これはC++タグ付けされているので

    String myClassName = "com.my.class.NameHere"; 
    Class c = Class.forName(myClassName); 
    Method m[] = c.getDeclaredMethods(); 
    for(Method method: m) 
        System.out.println(method.toString()); 
    
+0

フラグで判断すると、 C++ –

1

、ここではC++の答えです。

+0

あなたがbizzare構文を使用していた場合、私は知りませんでした:appologies。それ以外の場合:いくつかの構文エラーが修正され、使用法コードが追加されました。 –

+0

@MooingDuck Na、ちょうど入力する前にあまり考えることはありませんでした。 – Pubby

0

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'; 
} 
関連する問題