我知道当有一个矢量类型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
答案 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>();