6

ベクターが期待するクラスから派生したタイプである emplace_back を使用して、アイテムをベクターに格納できるかどうか疑問に思っています。

例えば:

struct fruit
{
    std::string name;
    std::string color;
};

struct apple : fruit
{
    apple() : fruit("Apple", "Red") { }
};

何処か別の場所:

std::vector<fruit> fruits;

ベクター内にタイプ apple のオブジェクトを格納したいと思います。これは可能ですか?

4

2 に答える 2

11

いいえ。ベクトルは、固定型の要素のみを格納します。オブジェクトへのポインターが必要です。

#include <memory>
#include <vector>

typedef std::vector<std::unique_ptr<fruit>> fruit_vector;

fruit_vector fruits;
fruits.emplace_back(new apple);
fruits.emplace_back(new lemon);
fruits.emplace_back(new berry);
于 2013-01-20T01:30:55.340 に答える
2

std::vector<fruit> fruits;sizeof(fruit)アロケーターは要素ごとに のみ割り当てるため、フルーツは派生型ではなくフルーツにのみ格納されます。ポリモーフィズムを維持するには、フルーツにポインターを格納する必要があります。

std::vector<std::unique_ptr<fruit>> fruits;
fruits.emplace_back(new apple);

アップルはフリーストアに動的に割り当てられ、要素がベクターから消去されると解放されます。

fruits.erase(fruits.begin());
于 2013-01-20T01:33:00.500 に答える