抽象类向量的C++向量

C++ vector of vector of abstract class

本文关键字:向量 C++ 抽象类      更新时间:2023-10-16

对于一个简单的国际象棋游戏,我想创建一个(国际象棋(棋子向量的 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));
}

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

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

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

首先,您不能使用抽象类作为 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>();

类属性 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;
}
}