1

私は何かをするコンソールアプリケーションを作りました。次のようになります。

class C
    {
    public:
        void print()
        {
            print("something that only class C knows");
        }
    }   
//**************************************    

class B
    {
    public:
        void print()
        {
            print("something that only class B knows");

            for_each(C c)
            {
                c.print();
            }
        }

    private:
        std::vector<C> c_classes;
    }
//**************************************

class A
    {
    public:
        void print()
        {   
            print("something that only class A knows");

            for_each(B b)
            {
                b.print();
            }
        }
    private:
        std::vector<B> b_classes;
    }

そして、どこからでも印刷できるコンソールでうまく機能します。

このアプリケーションをGUIに移植したいときに問題が発生します。クラスA、B、Cが知っていることをすべて示す必要があります。これを行うための最良の方法は何ですか?

クラスAがクラスBのベクトル(クラスCのベクトルへの参照を返す)への参照を返し、GUIクラスの各インスタンスから値を取得するように考えました。

しかし、GUIクラスをこれらのクラスにそれほど依存させたくありません。

これを行うためのより良い方法はありますか?

4

3 に答える 3

2

Printable純粋仮想print()メソッド(おそらく文字列を返す)を持ち、このオブジェクトへのポインターのベクトルをどこかに持つ共通のインターフェースを作成します。クラスAB持ち、からC派生しPrintableます。したがって、各オブジェクトの統計を出力する場合は、このベクトルを反復処理して出力を表示するだけです。

于 2012-09-25T15:13:18.590 に答える
1

クラス階層からデータを取得するための優れた方法は、ビジターデザインパターンを使用することです。このようにして、階層がトラバースされ(現在の階層と同様)、GUIで使用できる結果が作成されます。この結果は、オブジェクト名をキーとして、出力された文字列を値として持つstd::mapになる可能性があります。このマップは、GUIでテーブルを作成するために使用できます。

欠点は、訪問者が最初にいくつかの余分な複雑さを作成し、後でうまくいけば報われることです。

于 2012-09-25T15:30:17.290 に答える
1

他の答えの代わりに、「to_string()」メンバーを実装することもできます。これは、すべてのクラスに存在し、関連データを含む文字列を返します(たとえば、これはすべてのJavaプログラムで行われる方法です)。

または、特定のクラスのostream<<演算子をオーバーロードすることもできます。これを行う方法を説明する例がネット上にたくさんあるはずです。

于 2012-09-25T15:41:23.603 に答える