2016-11-28 9 views
0

ベクトル型のMapField *を持っていて、ShipFieldをpush_back()型にしたいときには、それは可能ですが、ダイナミック配列はどうですか? Map :: Mapコンストラクタの後にShipFieldをmapfield配列に代入することは可能ですが、どうすればよいですか?オブジェクトの2次元配列、サブクラスを割り当てる

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

はい。ちょうどそれを割り当てます。しかしここには二次元配列はありません。 –

+3

'std :: vector' *は動的な「配列」です。これを使って。そして、あなたは入れ子にされたベクトルを持つことができます。 –

+0

MapField ** mapfields; 2次元ダイナミックアレイではありませんか? – Felipe

答えて

0

技術的にはMapFieldへのポインタへのポインタです。配列の単純な動的配列としてとして使用できますが、それは1つではありません。しかし、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; 
}; 

は、ベクトル内の特定の場所で、あなたがそれを作成する新しいmapfieldを追加するには:

mapfields[x][y] = std::make_shared<MapField>(); 
mapfields[x][y + 1] = std::make_shared<ShipField>(); 
関連する問題