二维对象数组,赋值子类

时间:2016-11-28 14:40:51

标签: c++ inheritance dynamic-arrays assign

我知道当有一个矢量类型MapField *并且我想要push_back()类型为ShipField时它是可行的,但动态数组怎么样?可以在Map :: Map构造函数之后将类型的ShipField分配到mapfield数组,这是怎么做的?

class MapField 
    : public Field
{
public:
    MapField();
    MapField(int x, int y);
    virtual ~MapField();
    //GETTERS
    bool get_shoot_down();
    //SETTERS
    void set_shoot_down(bool shoot_down);
protected:
    bool shoot_down;
};

//

   class ShipField :
    public MapField
{
public:
    ShipField(Ship *ship, int x, int y);
    virtual ~ShipField();
    //GETTERS
    Ship* get_ship();
    //SETTERS
    void set_ship(Ship * ship);

public:
    Ship *ship;

};

//

Map::Map(const int mapsize)
    :
    mapsize(mapsize)
{
    this->mapfields = new MapField* [mapsize];
    for (int i = 0; i < mapsize; i++)
        this->mapfields[i] = new MapField[mapsize];
}

//

Task.WhenAll

1 个答案:

答案 0 :(得分:0)

从技术上讲,它是指向MapField指针的指针。它可以使用作为一个简单的动态数组数组,但它不是一个。但是,std::vector<std::vector<MapField>>在指向指针的指针永远不会是动态的。可以在Map构造函数初始值设定项列表中轻松初始化为mapfields(mapsize, std::vector<MapField>(mapsize))

要使其使用多态类,您需要使用指针。为此,我建议std::shared_ptr

class Map
{
public:
    Map(std::size_t const mapsize)
        : mapsize(mapsize),
          mapfields(mapsize, std::vector<std::shared_ptr<MapField>>(mapsize))
    {}
    ...
    std::vector<std::vector<std::shared_ptr<MapField>>> mapfields;
};

要添加新的地图字段,请在向量中的特定位置创建它:

mapfields[x][y] = std::make_shared<MapField>();
mapfields[x][y + 1] = std::make_shared<ShipField>();