3

クラスタイプ「xx」を含むstlベクトルがあるとしましょう。xxは抽象です。次のようなことをすると、コンパイラが「インスタンス化」できないという問題が発生しました。

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

void main()
{
    ;
}

これは、コピーコンストラクターを呼び出す必要があるためだと思います。この問題を回避するには、xxではなくxx*をベクトルに格納します。より良い解決策はありますか?それは何ですか?

4

3 に答える 3

12

を使用するpush_backと、オブジェクトのコピーが作成され、ベクターに保存されます。ご想像のとおり、抽象クラスをインスタンス化できないため、これは機能しません。これは、基本的にコピー構築が行っていることです。

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

于 2009-08-10T18:22:55.860 に答える
2

教皇 (またはこの場合はスティーブ・グイディ) よりもカトリック的であるためには、STL コンテナーに格納されるオブジェクトの要件は、それらがコピー構築可能で代入可能であり、抽象クラスがそのどちらでもないことです。したがって、この場合、ポインターのコンテナーが適しています。クラスを抽象化しないことで問題を修正することにした場合に考慮すべきもう 1 つのことは、スライスです。

于 2009-08-10T18:44:47.110 に答える
0

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

于 2009-08-10T18:29:57.560 に答える