3

A が抽象基本クラスで、B と C がポリモーフィックな子である継承階層があります。

B および C オブジェクトを含むことができる、ヒープ上にベクトル クラス データ メンバーが必要です。

したがって、ヘッダーファイルには

vector<A*> polymorphicobjs;

そして、私がやろうとしたコンストラクターで:

polymorphicobjs = new vector<A>();

しかし、明らかにこれは機能しません。どうすればこれを達成できますか?

4

5 に答える 5

5

std::vector生のポインタを保持することについて心配する必要はありません。後で適切なタイミングでオブジェクトを削除することを確認する際に、多くの手間がかかります。あなたがすべきことは、「管理された」ポリモーフィック オブジェクトのコンテナを格納することです (スマート ポインタを使用)。ベクトルを宣言します。

std::vector<std::unique_ptr<A>> polymorphicobjs;

これで、ポリモーフィック オブジェクトをベクトルに簡単に格納できるようになりました (Bは のサブクラスですA)。

polymorphicobjs.push_back(std::unique_ptr<B>(new B));

deleteこれにより、ベクター内のオブジェクトの呼び出しについて心配する必要がなくなります。ベクターを「手放す」とすぐに (たとえば、関数のスコープ外になったときや、クラス メンバーの場合は自動的に破棄されたとき)、オブジェクトは削除されます。ベクトルはオブジェクトを一意に所有します。

しかし、オブジェクトを他のコードと共有する必要がありますか?!

もしそうなら、それstd::unique_ptrは正しい選択ではありません。を使用して、オブジェクトが共有されていることを表現できますstd::shared_ptr

std::vector<std::shared_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_shared<B>());

push_backユニークと共有で見た目が違うのはなぜですか?

C++14 はまだリリースされていないためです。幸運にも十分に新しいコンパイラ (最先端の clang/gcc/VS2013) を使用できる場合、独自のバージョンは非常によく似たものになります。

// C++14
std::vector<std::unique_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_unique<B>());
于 2013-09-26T12:26:26.817 に答える
2

C++ 11がオプションである場合、またはブーストのものである場合は、標準のshared_pointersに固執することを本当にお勧めします。

あなたの基本的な問題は、vectorへのポインターではなく、ポインターのa を宣言したことですvector

vector<T*> vec1;// a vector of pointers
vec1.push_back(new T); // add a pointer to our vector

vector<T*>* vec2; //a pointer to a vector of pointers
vec2 = new vector<T>; // create the vector on the heap
vec2->push_back(new T); // add pointer.

私が言ったように、これはおそらくあなたが望むものではありません。スマート ポインターを使用する必要があります。

vector<std::shared_ptr<A>> vec;
vec.push_back(std::make_shared<B>());
于 2013-09-25T16:15:18.560 に答える
1

なぜあなたはやりたいのnewですか?

この行:

vector<A*> polymorphicobjs;

すでに初期化していますvector...その後、次のことができます:

polymorphicobjs.push_back( an_object );

本当にヒープに置きたい場合は、宣言を次のように変更します。

vector<A*>* polymorphicobjs;
//        ^

でも必要ないと思う…

于 2013-09-25T16:04:09.577 に答える