特殊化せずにベクトルを持つことは可能ですか?
私の問題は次のとおりです。抽象クラス N4GestureRecognizer とそのサブクラスがいくつかあります。したがって、コントローラークラスには が必要ですが、vector<N4GestureRecognizer> recognizers_
抽象的であるためできません。このレコグナイザーをベクター、コレクション、リスト、または標準の c++ でループ可能なものに保存するにはどうすればよいですか?
それらをポインタとして保存します。純粋なポインターまたはスマート ポインター クラスのいずれか。
EXTRA 実際には、クラスが抽象化されていなくても、ポインターが唯一の方法ですが、サブクラス化されており、子クラスがベクターで使用されることを意図しています。理由: std::vector は各要素に sizeof(T) バイトを割り当てますが、sizeof(derivedFromT) は sizeof(T) よりも大きくなる可能性があります。子オブジェクトをベクターにプッシュすることはできますが、実行時に予期しない問題が発生する可能性があります。
もちろん、ポインターのベクトルを管理するのは面倒ですが、私が覚えている限りでは、boost にはタスクを簡素化するためのスマート ポインターがいくつか含まれています。
必要なのはstd::vector< std::shared_ptr<N4GestureRecognizer> >
.
std lib が含まれていない場合std::shared_ptr
(次の C++ 標準の一部であり、来年公開される予定です) std::tr1::shared_ptr
、同じもの (公式テクニカル レポート 1による現在の C++ 標準への追加として) が付属している可能性があります。それも失敗した場合は、常にboostがあり、これにはboost:shared_ptr
( and の前身) がstd::tr1::shared_ptr
ありstd::shared_ptr
ます。
注:ネイキッド ポインター ( ) は使用しないでくださいstd::vector<N4GestureRecognizer*>
。これを漏れないように安全にする方法はほとんどありません。