2011-11-12 10 views
2

同じ基本クラスから派生した複数のクラス型を1つのstlリストに格納したいとします。単一のリストに複数の派生クラス型を格納する

私は

list<BaseClass> L; 

を使用している場合は、私はすべての派生クラスを追加するときに私のコードは正常にコンパイルされます。しかし、私の派生したクラスは、格納される前に基底型に自動的にキャストされているようです。もちろん、派生型のユニークなメンバーも格納したいと思う。これどうやってするの?

+0

私はあなたが複数のオブジェクトを意味すると思います。 – leo

答えて

4

あなたが

list<BaseClass *> L; 

しかし、これで、あなたは例外の安全性に問題がありますを使用する必要があります。だから多分:

#include <list> 
#include <tr1/memory> 

std::list<std::tr1::shared_ptr<BaseClass> > L; 

が良いでしょう。 TR1の基本情報は、例えば、 wikipediaに、そのdocumentation がブースト文書の下にあります。

+0

+1のために 'tr1'を表示する+1 –

+0

@KirilKirovもしこれらのスマートポインタがC++ 11にも含まれていると言えば+1になります。また、あなたが必要としない場合には' unique_ptr'を使うこともできます。 'shared_ptr'のオーバーヘッド。私はこれがすべて答えに属しているわけではないかも知れないが、実際には彼はスマートな指針で始める者だった。 –

+0

Christian Rau:私は 'shared_ptr'オーバーヘッドを認識しています。しかし、現在では追加のライブラリ(Boost)や別の標準(C++ 11)がない唯一のソリューションです。 –

1

あなたは(1秒は少し危険である)list< Baseclass* >

または list< Baseclass& >としてコンテナを作成する必要があります。 (@Cat Plus Plusのコメントのおかげで "削除されました")

list<Baseclass>を使用すると、slicing issueに適合します。

+1

参照は割り当てできないため、参照は使用できません。 –

+0

ああ、ありがとう! –

+0

aaaaaand -1? –

0

あなたが望むことをするためには、ポインタで作業する必要があります。可能な解決策はstd::list<BaseClass*>ですが、今はコピー、複製、削除に対処する必要があります。より良い選択肢は、あなたのために自動的に行うBoost.Pointer Containersを使用することです。 (リストはスコープの外に出たとき、あなたは、オブジェクトを破壊するのですか?いくつかの例外が前にスローされた場合はどうすれば?)

関連する問題