2014-12-27 57 views
0

我正在尝试构建一个棋子的棋盘。我在我的主得到这个如何为抽象类创建二维数组

class ChessPiece 
{ 
public: 
    ChessPiece(); 
    virtual ~ChessPiece(); 
    virtual bool movePiece() = 0; 
}; 

这个类

class Pawn: public ChessPiece 
{ 
public: 
    Pawn(); 
    virtual ~Pawn(); 
    bool movePiece(); 
}; 

我想创建ChessPiece的二维数组,但是因为它是抽象的它给我的问题。

我想这

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

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

,但它似乎并不工作.. 任何帮助将不胜感激 谢谢!

+0

'ChessPiece *** board = new ChessPiece * [8];'Hooray,你现在是3星级程序员。恭喜! – 2014-12-27 17:41:01

回答

4

您的董事会必须持有指向ChessPiece的指针,每个指定单独分配。董事会总是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... 

编辑:使用每片类型的固定大小的数组,因为它是可能的走卒得到提拔到其他部分删除的实现类型)。

当然,你可以安排不同的数据。您应该将所有游戏数据分组为ChessGame类或结构。你可以写一个PlayerPieces类,只包含一个玩家的棋子,然后把他们中的两个放在ChessGame。有很多可能性 - 最终取决于你自己的风格和喜好。

+0

我可以那样做。但是'new'没有为它分配内存?如果我将我的板子发送到另一个功能会发生什么?当范围结束时它会被删除? – Mumfordwiz 2014-12-27 17:15:13

+2

你的程序应该有明确的所有权策略。没有理由为什么把棋盘作为参数的函数会删除它 - 通过指针或引用传递它。 – japreiss 2014-12-27 17:18:01

+0

可能是我错过了一些东西,但是'new'和'delete'看起来不错,如果这些棋子要移动到棋盘上,不仅仅是初始化,不是吗? +1 btw – P0W 2014-12-27 17:22:52