2

我正在考虑棋盘设计,并想做一些类似的事情:

typedef std::map <std::string, CheckerPiece> MapType;
MapType CheckerBoard;

CheckerBoard.insert({"a1", null});

这是允许的,还是有办法做类似的事情?这个想法是我想保持棋盘状态,同时将 CheckerPiece 对象从一个位置移动到另一个位置。

编辑: 按照同样的思路,是否可以执行以下操作:

CheckerBoard.insert({"a1", new CheckerPiece()});
4

4 回答 4

8

您的地图不CheckerPiece包含指针,因此您尝试执行的操作甚至都不会编译,除非您有一个隐式构造函数,CheckerPrice该构造函数将指针作为参数。这忽略了nullC++. 假设你的意思是NULLor nullptr,你不能插入其中任何一个,或者结果

new CheckerPiece()

进入你的地图,期间。上面的表达式返回一个指向 的指针CheckerPiece

C++ 没有类型空值的概念(除非您专门设计了一个)。一种解决方法是使用为您提供可选语义的包装器类型,即允许您检查是否已“设置”某些内容。一个例子是boost::optional

这是一个未经测试的示例:

#include <boost/optional.hpp>

boost::optional<CheckerPiece> piece;

if (piece) {
  // piece is not set, we should never get here
}

piece.reset(CheckerPiece( constructor arguments...));

if (piece) {
  // piece is set, use it!
  piece.move();
}
于 2013-02-20T19:23:05.767 回答
1

CheckerPiece看起来像什么?最明显的解决方案是添加对应于缺少一块的额外可能性。Pieces 真的没有任何行为,你也不需要它们;您实际上只需要有关正方形状态的信息:红色、黑色或空,以及是否加冕(如果为空则忽略)。

我可能会补充一点,将棋盘作为地图可能也不是最精明的解决方案。我会选择类似的东西:

CheckerPiece board[10][10];

(或者,如果您想支持本地变体,而不仅仅是国际标准检查器,模板参数CheckerPiece board[N][N]在哪里)。N

于 2013-02-20T19:51:14.093 回答
0

如果要使用指针/堆分配的 CheckerPieces,则必须将映射定义为使用 aCheckerPiece*而不是 a 。在 C++ 中没有“这里没有对象”值CheckerPiece这样的东西。null在不使用第三方库的情况下指示可选对象的规范方法是使用指针并将其设置为nullptr如果可选元素不存在。

我可能会用它boost::optional来表示 CheckerPiece 可能位于也可能不在给定位置,除非您有不能使用第三方库的原因。

于 2013-02-20T19:24:02.320 回答
0

改变你对董事会的定义。

棋盘或棋盘状态是<checker piece, location>. 任何不在此容器中的棋盘位置都被视为空。任何不处于棋盘状态的检查器都已被捕获。

有了这个概念,就不需要一个空检查块,也不需要比较一个检查块是否为 NULL。

在计划移动或创建移动历史时,您可以使用棋盘状态容器。

我建议创建将使用给定的板状态绘制板的函数。这消除了尝试从棋盘状态容器中表示每次移动时的实际棋盘的问题。

于 2013-02-20T20:19:20.977 回答