2

わかりました、状況: createSomeObject() メソッドを持つ、制御できないライブラリを使用しています。このメソッドは、純粋な仮想関数を持つ抽象基本クラスへのポインターを返します。コピー コンストラクターがないため、自分でインスタンス化することもコピーすることもできません (明らかに)。

これらのいくつか (10 としましょう) をベクトルに格納する必要があるため、次のことを試みました。

vector<AbstractBaseClass*> v(10);

for(int i = 0; i < 10; i++)
{
    v.push_back(library->createSomeObject());
}

このループが終了するとすぐに、ベクターは壊れたポインターで埋められます。

私は次のことを試しました:

vector<AbstractBaseClass*> v(10);

for(int i = 0; i < 10; i++)
{
    AbstractBaseClass* abc = library->createSomeObject();
    v.push_back(abc);
}

無駄に。ここで私は頭がおかしくなっているか、何か重大な間違いをしているに違いありません。私は周りを見回しましたが、答えは常にboost::shared_ptrを使用することです. おそらく素晴らしい解決策ですが、これが構築されるマシン上にあるとは保証できないため、Boost をコードでパッケージ化することは避けたいと思います。

足りないものはありますか?これらのいずれかが機能しない理由が思いつかないので、単純なことを忘れているように感じます。

4

1 に答える 1

10

これを行う場合:

vector<AbstractBaseClass*> v(10);

既に 10 個の (NULL) ポインターを含むベクターを作成しています。したがって、 を呼び出した後push_back、20 個のポインターを持つベクトルが得られます。そのうち最初の 10 個は無効です。

事前にサイズが分かっている場合:

vector<AbstractBaseClass*> v(10);
for(int i = 0; i < 10; i++)
{
    v[i] = library->createSomeObject();
}

reserveまたは、空のベクターを作成した後に呼び出します。

于 2012-08-10T03:45:51.087 に答える