1

編集:

質問全体を書き直して、段階的に進めていくことにしました。

したがって、std::list (以下に示す ObjectA および ObjectB など) 内に型を格納したいのですが、これらの型はすべて、期待される型 (この例のように int const*) を返すメンバー プロパティを持っている必要があります。

class ObjectA
{

public:

    int const* GetItem () {return mpItem;} const;

private:

    int*        mpItem;
    ObjectC     mrObjectC;

}; // class



class ObjectB
{

public:

    int const* GetItem () {return &mrItem;} const;

private:

    int         mrItem;
    ObjectD     mrObjectD;

}; // class

したがって、上記の 2 つのオブジェクトは、次のように std::list 内にある必要があります。

ObjectA         nrA;
ObjectB         nrB;

std::list<###   const*> nrRender;

nrRender.push_back (nrA); // comes down to storing ObjectA and ObjectB
nrRender.push_back (nrB); // inside the same list

これがすべて完了した後。サブルーチンは std::list を反復し、次のようにさらに処理するためにデータを送信します。

std::list<###   const*> nrRender::const_iterator niObject;
for (niObject = nrRender.begin(); niObject != nrRender.end(); ++niObject) {

    this -> Display ((*niObject).GetItem ());

}

最後に、これもやりたいです:

nrRender.remove(nrA);
nrRender.remove(nrB);
4

2 に答える 2

0

コンパイラと半日戦った後、これが解決策です(仮想インターフェイスと基本クラスが1つとして機能します):

class TypeA
{

public:

    virtual int GetCount () = 0; // The notation =0 simply indicates the Virtual function is a pure virtual function as it has no body

};



class TypeB : public TypeA
{

    string      GetTitle ();

public:

    string      mrTitle;

};



class TypeC : public TypeB
{

public:

    int GetCount () {return 5;}

};



class TypeD : public TypeB
{

public:

    int GetCount () {return 8;}

};

ソリューションのテスト:

        TypeC           nrC;
        TypeD           nrD;
        list<TypeB*>    nrRender;

        nrRender.push_back(&nrC);
        nrC.GetCount();

        nrRender.push_back(&nrD);
        nrC.GetCount();

        cout << endl << "Ca: " << &nrC;
        cout << endl << "Da: " << &nrD;

        cout << endl << "SizeA: " << nrRender.size();

        list<TypeB*>::iterator niItem;
        for (niItem = nrRender.begin(); niItem != nrRender.end(); ++niItem) {

            cout << endl << "Adress: " << (*niItem);
            cout << endl << "Counts: " << (*niItem) -> GetCount();

        }

        nrRender.remove(&nrD);

        cout << endl << "SizeB: " << nrRender.size();

        for (niItem = nrRender.begin(); niItem != nrRender.end(); ++niItem) {

            cout << endl << "Adress: " << (*niItem);
            cout << endl << "Counts: " << (*niItem) -> GetCount();

        }

これが誰かを助けることを願っています。

于 2012-12-16T09:01:33.033 に答える
0

あなたのコードを正しく理解していれば、nrZオブジェクトはメソッドを介して渡されたものをすべて検査しHooksInto、その引数で見つかった内部オブジェクトの参照を保持します。

たとえば、オブジェクトnrBにオブジェクトiB1とが含まれている場合iB2nrZを調べることで、それらを見つけてそれらへの参照を保持できますnrB

このnrRender.push_back(nrZ)呼び出しにより、nRenderこれらの参照が取得され、さらに処理するために保存されます。ただし、nrRender.remove(nrB)が呼び出された場合は、これらの参照をnrRenderオブジェクトから削除する必要があります。

listあなたのコードで言及されているテンプレートは実際にはstd::list.

したがって、nrRendertype の値のみを格納できますTypeZ。これは実際にはコードの問題です。to値nrRenderを追跡したい場合は、最も一般的なタイプのリストにする必要があります : 。ただし、値がリストにプッシュされると、以下に示すように、その完全な型は忘れられます。TypeATypeZTypeA

  list<TypeA *> nrRender;
  TypeB nrB;      
  TypeA *ptr;

  nrRender.push_back(&nrB);
  ptr = nrRender.pop_back(); // here we're getting back nrB, 
                             // but now it's a (TypeA *) value

また、リストをインスタンスへのポインタのリストにしないと、渡されたオブジェクトへの参照を保持できません。

次に、必要な機能が利用できません。このメソッドは、メソッドが要求どおりに機能するnrZ::HooksIntoために継承を介してオブジェクトを構築する必要がある場合に、合成を使用してオブジェクトを構築することを示唆しています。list<TypeA>::remove

そうでlistはなくstd::list、必要な機能を実装したいテンプレートがある場合、これは可能だと思いますが、テンプレートにする意味がわかりません。

 class render_list {

   public:
     /* ... */
     void push_back(const TypeZ &t){
         // get the inner references within t
         // store them in this instance
     }
     void remove(const TypeA &t){
         // remove t
     }
     // overload remove if necessary to handle TypeB peculiarity
     void remove(const TypeB &t){
         // remove t
     }
     // etc.
     void remove(const TypeA &t){
         // remove t
     }
 };

正確に何を達成しようとしているのかについての詳細がなければ、より良いガイダンスを提供することは難しいことに注意してください。

于 2012-12-16T05:10:32.667 に答える