0

对于一个简单的国际象棋游戏,我想创建一个(国际象棋)棋子向量的二维向量。所以我的课看起来像

class board {
    private:
        int width, height; //dimensions
        vector<vector<piece> > pieces2D;

    public:
        board(int w=8, int h=8) 
        {
            width = w; height = h;
            vector<vector<piece>> pieces2D(w, vector<piece>(h, 0));
        }

其中piece 是一个抽象类,所以我不能使用数组。但我无法在构造函数中创建默认大小为 8x8 的pieces2D。什么不见​​了?我也很欣赏存储 64 个(抽象)片段的其他解决方案。

4

3 回答 3

2

您无法实例化抽象类 - 因此您无法构造包含抽象类型的向量。

这里的解决方案是存储一个指针向量: vector<vector<std::unique_ptr<piece>>>

于 2019-08-22T07:25:01.630 回答
1

首先,您不能将抽象类用作 std::array、std::vector 或任何其他 STL 容器类的模板。如果您想使用多态性,请使用 std::unique_ptr 或 std::shared_ptr 来存储指向对象的指针。

可以完成pieces2D成员的初始化

class board {
  private:
    int width, height; //dimensions
    vector<vector<piece> > pieces2D;

  public:
    board(int w=8, int h=8) 
      : pieces2D(w, vector<piece>(h, 0))
    {
        width = w; height = h;
    }
};

但是如果不用 std::shared_ptr 替换片段,它将无法工作。恕我直言,最好对这些片段使用平面(一维)数组,因为这样您就只有一个堆块要管理。您可以使用 () 运算符(或简单的成员函数)按行和列访问片段:

class Board
{
private:
   int width, height;
   std::vector<std::shared_ptr<Piece>> pieces;

public:
   Board(int width_, int height_)
      : width(width_),
      height(height_),
      pieces(width_ * height_)
   {}

   std::shared_ptr<Piece>& operator()(int row, int col)
   {
      return pieces[row*width+col];
   }
};

并使用它:

Board board(8, 8);
board(1, 2) = std::make_shared<PawnPiece>();
于 2019-08-22T07:48:49.077 回答
0

类属性pieces2D的初始化不正确。

您正在尝试做的是初始化类属性,但您有效地做的是初始化一个名为 pieces2D 的构造函数本地对象,当程序超出构造函数范围时将被销毁。

此外,您不能实例化抽象对象的向量,因为没有对象可以从抽象类中实例化。但是您可以实例化一个指向抽象对象的指针向量,并将指向从基本抽象类派生的具体对象的指针分配给它。

您要查找的可能是pieces2D 的初始化列表。

喜欢 :

class board {
private:
    int width, height; //dimensions
    vector<vector<piece*> > pieces2D;

public:
    board(int w=8, int h=8): pieces2D(w, vector<piece*>(h, 0))
    {
        width = w; height = h;
    }
}
于 2019-08-22T07:31:20.517 回答