C++ 如何为抽象类创建二维数组

C++ 如何为抽象类创建二维数组,c++,arrays,inheritance,abstract-class,C++,Arrays,Inheritance,Abstract Class,我想用棋子做一个棋盘。我知道了 class ChessPiece { public: ChessPiece(); virtual ~ChessPiece(); virtual bool movePiece() = 0; }; 这个班呢 class Pawn: public ChessPiece { public: Pawn(); virtual ~Pawn(); bool movePiece(); }; 在我的主要工作中,我试图创建一个二维棋

我想用棋子做一个棋盘。我知道了

class ChessPiece 
{
public:
    ChessPiece();
    virtual ~ChessPiece();
    virtual bool movePiece() = 0;
};
这个班呢

class Pawn: public ChessPiece
{
public:
    Pawn();
    virtual ~Pawn();
    bool movePiece();
};
在我的主要工作中,我试图创建一个二维棋子数组,但因为它是抽象的,所以给了我一些问题

我试过这个

ChessPiece** board = new ChessPiece[8][8];

但它似乎不起作用。。 任何帮助都将不胜感激
谢谢大家!

您的棋盘必须持有指向
棋子
的指针,每个棋子都要单独分配。电路板始终为8x8,因此没有理由为其分配
new
。相反:

ChessPiece * board[8][8];
然后是:

for (int i = 0; i < 8; ++i) {
    board[1][i] = new Pawn();
}
board[0][0] = new Rook();
board[0][1] = new Knight(); 
// etc...
for(int i=0;i<8;++i){
董事会[1][i]=新当铺();
}
板[0][0]=新车();
董事会[0][1]=新骑士();
//等等。。。
编辑:删除了使用每个工件类型的固定大小数组的实现,因为典当可以升级到其他工件类型。)


当然,您可以对数据进行不同的安排。您可能应该将所有游戏数据分组到一个
ChessGame
类或结构中。您可以编写一个只包含一个玩家棋子的
playerpiees
类,然后将其中两个棋子放入
ChessGame
中。有很多种可能性——最终取决于您自己的风格和偏好。

您的棋盘必须持有指向
棋子的指针,每个棋子都是单独分配的。电路板始终为8x8,因此没有理由为其分配
new
。相反:

ChessPiece * board[8][8];
然后是:

for (int i = 0; i < 8; ++i) {
    board[1][i] = new Pawn();
}
board[0][0] = new Rook();
board[0][1] = new Knight(); 
// etc...
for(int i=0;i<8;++i){
董事会[1][i]=新当铺();
}
板[0][0]=新车();
董事会[0][1]=新骑士();
//等等。。。
编辑:删除了使用每个工件类型的固定大小数组的实现,因为典当可以升级到其他工件类型。)


当然,您可以对数据进行不同的安排。您可能应该将所有游戏数据分组到一个
ChessGame
类或结构中。您可以编写一个只包含一个玩家棋子的
playerpiees
类,然后将其中两个棋子放入
ChessGame
中。有很多种可能性——最终取决于你自己的风格和喜好。

我可以做到。但是
new
没有为它分配内存吗?如果我将我的板发送到另一个函数,会发生什么?当作用域结束时,它将被删除?您的程序应具有定义良好的所有权策略。没有理由让一个以你的棋盘为参数的函数删除它——通过指针或引用传递它。可能是我遗漏了什么,但是
new
delete
看起来不错,如果棋子要在整个棋盘上移动,而不仅仅是初始化,不是吗+1 btwBetter可以是
std::阵列板
@P0W不需要,移动一块就像:
board[row+1][col]=board[row,col];线路板[行][列]=nullptr例如,将兵推进一个空格,我可以这样做。但是
new
没有为它分配内存吗?如果我将我的板发送到另一个函数,会发生什么?当作用域结束时,它将被删除?您的程序应具有定义良好的所有权策略。没有理由让一个以你的棋盘为参数的函数删除它——通过指针或引用传递它。可能是我遗漏了什么,但是
new
delete
看起来不错,如果棋子要在整个棋盘上移动,而不仅仅是初始化,不是吗+1 btwBetter可以是
std::阵列板
@P0W不需要,移动一块就像:
board[row+1][col]=board[row,col];线路板[行][列]=nullptr例如将棋子推进一个空格
棋子***棋盘=新棋子*[8]万岁,你现在是3star程序员了。恭喜你<代码>棋子***棋盘=新棋子*[8]万岁,你现在是3star程序员了。恭喜!