2009-08-10 3 views
3

私はクラス型 "xx"を含むstlベクトルを持っているとしましょう。 xxは抽象です。私はコピーコンストラクタが呼び出されなければならないためであると仮定しstl vector.push_back()抽象クラスがコンパイルされない

std::vector<xx> victor; 
void pusher(xx& thing) 
{ 
    victor.push_back(thing); 
} 

void main() 
{ 
    ; 
} 

:私は、コンパイラが、私は、次のような何かをするとき、私は「インスタンス化」させません問題に遭遇してきました。私は、xxの代わりにxx *をベクトルに格納することで、この問題を回避してきました。より良い解決策はありますか?それは何ですか?

答えて

12

push_backを使用すると、オブジェクトのコピーを作成してベクトルに格納しています。あなたが推測しているように、抽象クラスをインスタンス化することはできないので、これは動作しません。抽象クラスは、基本的にコピー構築が行っていることです。

ポインタを使用するか、boostlokiのようなライブラリで使用できる多くのスマートポインタタイプの1つを使用することをお勧めします。

+7

しかし、* std :: auto_ptrは使用しません。それらは、奇妙なコピーセマンティクスのためにSTLコンテナに入れることはできません。 –

+5

あなたはまたboostのptr_vectorを使うことができます - http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/ptr_container.html – bdonlan

+1

stlベクトルを使うときはxxの状態をコピーしていますそれを取得すると、C++は最初にxxをインスタンス化し、次に適切なプロパティでそれを埋めます。単に古いオブジェクトを指すのとは対照的です。ですから、問題はxxのコンストラクタを使用することですか? – Ori

0

std :: vector(およびSTL全体)は値を格納するように設計されています。抽象クラスを持っている場合は、この型の値を操作するのではなくポインタやポインタへの参照を操作します。したがって、抽象クラスのstd :: vectorは意味をなさない。そして、たとえ抽象的ではないとしても、基本クラスとなるように設計されたクラスを値として操作するのは通常は意味がありませんが、通常はコピー不可でなければなりません(コピーコンストラクタと代入演算子はプライベート宣言され、実装されません。 boost :: noncopyableのような子孫をコピー不可能にすることを孤独な目的とする適切なクラスは、流行になっています。

2

Pope(またはこの場合はSteve Guidi)よりもカトリックであるためには、STLコンテナに格納されるオブジェクトの要件は、それらがコピーコンストラクタブルでアサイン可能であり、抽象クラスでもないということです。この場合、ポインタのコンテナが移動する方法です。 クラスを抽象化しないことで問題を解決する場合には、もう1つ考慮すべきことはslicingです。

関連する問題