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

Posted

技术标签:

【中文标题】如何为抽象类创建二维数组【英文标题】:How to create a 2-dimension array for abstract class 【发布时间】:2014-12-27 17:00:46 【问题描述】:

我正在尝试构建一个由棋子组成的棋盘。我得到了这个

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];

但它似乎不起作用.. 任何帮助将不胜感激 谢谢!

【问题讨论】:

ChessPiece*** board = new ChessPiece*[8]; 万岁,你现在是三星级程序员了。恭喜! 【参考方案1】:

您的电路板必须保存指向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 中。有很多可能性——最终取决于你自己的风格和喜好。

【讨论】:

我能做到。但是new 不会为它分配内存吗?如果我将电路板发送到另一个功能会发生什么?范围结束时会删除吗? 您的程序应该有明确的所有权政策。没有理由将您的棋盘作为参数的函数将其删除 - 通过指针或引用传递它。 可能是我遗漏了一些东西,但 newdelete 看起来不错,如果要在整个板上移动棋子,而不仅仅是初始化,不是吗? +1 顺便说一句 最好是std::array&lt;std::array&lt;std::unique_ptr&lt;ChessPiece&gt;,8&gt;,8&gt; board; @P0W 不需要,移动棋子就像:board[row + 1][col] = board[row, col]; board[row][col] = nullptr; 例如将棋子前进一格

以上是关于如何为抽象类创建二维数组的主要内容,如果未能解决你的问题,请参考以下文章

如何为二维数组分配和释放堆内存?

如何创建一个 1 形成“菱形”形状的二维二进制数组

java 类型类怎么初始化赋值

C 语言二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )

Java开发新手入门教程!java二维数组输出其中的数

c++中二维数组的内存分配