簡體   English   中英

對象的二維數組,分配子類

[英]Two dimensional array of object, assign sub class

我知道當向量類型為MapField *且我想push_back()類型為ShipField時是可行的,但是動態數組呢? 可以將Map :: Map構造函數后的ShipField類型設置為mapfield數組,該怎么做?

class Map
{
public:
    Map(const int mapsize);
    virtual ~Map();
    //GETTERS
    MapField **get_mapfields();
    //SETTERS;
    bool check_ships();
    bool shoot(Field * field);
private:
    const int mapsize;
    MapField **mapfields;
    std::vector<Ship *> ships;
};

//

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];
}

從技術上講,它是指向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>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM