对于一个简单的国际象棋游戏,我想创建一个(棋子)矢量的2D矢量。所以我的课看起来像
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));
}
哪里是抽象类,所以我不能使用数组。但是我无法在构造器中创建默认大小为8x8的pieces2D。缺什么?我也很欣赏其他解决方案来存储64(抽象)件。
答案 0 :(得分:2)
您无法实例化抽象类-因此,您无法构造包含抽象类型的向量。
这里的解决方案是存储指针向量:
vector<vector<std::unique_ptr<piece>>>
答案 1 :(得分: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>();
答案 2 :(得分:0)
类属性pieces2D的初始化不正确。
您想要做的是初始化class属性,但是您实际上要做的是初始化构造函数本地的对象,该对象名为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;
}
}