私はクロスプラットフォームC++で作業しており、いくつかのクラスを次のように定義しています:(この例では大幅に簡略化されています)
class ExampleBase
{
public:
ExampleBase( int blah ) : blah_test(blah) { }
virtual void DoSomething( ) = 0;
private:
int blah_test;
};
class ExampleImplementer : public ExampleBase
{
public:
ExampleImplementer( ) : ExampleBase( 5 ) { }
virtual void DoSomething( ) { /* unique implementation here */ }
};
元々、私は単一のクラスしか持っていませんでした。それは、std :: vectorにインスタンスの束を格納し、const参照によって渡されました。しかし今、私は基本クラス(純粋な仮想を維持したい)といくつかのポリモーフィック実装クラスを持っている必要があります。
実装インスタンスのコレクションを持ちながら、スタックにstd :: vectorを割り当てるなど、リークのない簡単なメモリ管理を行うための最良の方法は何ですか?
std :: vectorはクラスが非純粋な仮想である必要があるため(内部割り当て/コピーなどを行うため)、明らかにstd ::vector<ExampleBase>を使用することはできません。コードのユーザーが誤ってExampleBaseのインスタンスを作成してほしくないのは、それが間違っているからです。また、オブジェクトのスライスやその他の厄介な問題の可能性を回避したいと思います。
一連の
std::auto_ptr作業で十分ですが、すべてを初期化して、「空きスロット」を探し、イテレータなどを探す必要があります。このホイールの再発明をすべて行うのは少しおかしいようです。boost::ptr_vector有望に見えましたが、Linuxでビルドする場合、ExampleBaseが非純粋な仮想である必要があるという点で、少し奇妙な動作をします。理由はわかりませんboost::ptr_vector。
これは単純なようで、おそらく本当に一般的な状況です。では、これを行うための最良の方法は何ですか?私はこれを行う他の標準またはブーストの方法を受け入れています:「最良」の方。