[英]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.