如何为抽象类创建二维数组
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
不会为它分配内存吗?如果我将电路板发送到另一个功能会发生什么?范围结束时会删除吗?
您的程序应该有明确的所有权政策。没有理由将您的棋盘作为参数的函数将其删除 - 通过指针或引用传递它。
可能是我遗漏了一些东西,但 new
和 delete
看起来不错,如果要在整个板上移动棋子,而不仅仅是初始化,不是吗? +1 顺便说一句
最好是std::array<std::array<std::unique_ptr<ChessPiece>,8>,8> board;
@P0W 不需要,移动棋子就像:board[row + 1][col] = board[row, col]; board[row][col] = nullptr;
例如将棋子前进一格以上是关于如何为抽象类创建二维数组的主要内容,如果未能解决你的问题,请参考以下文章