在类中声明映射,并指向一个(尚未)现有类作为值?

时间:2015-12-05 11:54:11

标签: c++ dictionary

我试图使用地图创建一个国际象棋游戏,并有一个Chessboard类存储它。

/* Headers and stuff */
class Piece;

Chessboard::Chessboard() {
  board["A1"] = new Piece*; /* Castle */
  board["B1"] = new Piece*; /* Knight */
  board["C1"] = new Piece*; /* Bishop */
  ...

在这里阅读了一些答案之后,我认为通过向前声明片段,编译器会让我创建一个带有键字符串和值Piece *的地图。但是,我收到了这个错误。

g++ -Wall -g -c chess.cpp
chess.cpp:19:15: error: assigning to 'mapped_type' (aka
'Piece*') from incompatible type 'Piece **'; dereference
with *

Chessboard所在的头文件是:

// Header and stuff
class Piece;

class Chessboard {
public:
  Chessboard();
  ~Chessboard();
private:
  map<string, Piece*> board;
  map<string, Piece*>::iterator iterator;
}

如何在Chessboard中创建地图,并指向尚未创建的Piece?请在答案中保留地图的使用(即使它不是国际象棋的最佳选择)。

3 个答案:

答案 0 :(得分:1)

代码中的问题是new会生成指向您正在创建的类型的指针。当你这样做时

new Piece*

类型为Piece*,因此您返回指向Piece指针的指针。要获得指向Piece的指针,请使用

new Piece

代替。

注意: map<string,Piece*>不是表示国际象棋棋盘的最佳数据结构。最好使用指向Piece的2D数组,以及将方块标签映射到{row, column}对的方案:

array<array<Piece*,8>,8> board;
board[0][0] = new Piece;

答案 1 :(得分:1)

这里不需要指针或动态内存。只需使用自动变量,即相应地将board更改为map<string, Piece>iterator

然后您可以像这样插入默认构造的Piece

  board["A1"]; /* Castle */
  board["B1"]; /* Knight */
  board["C1"]; /* Bishop */

然后您不需要为您的类定义任何析构函数。

答案 2 :(得分:0)

放弃new Piece*来电,您将获得地图中自动构建的Piece*项。如果您没有在Piece类的实际定义中包含标题,则无法通过将new Piece*切换为new Piece来解决问题(因为它需要完整在呼叫点定义的类型)。无论何时何地,您都希望将真实的Piece添加到地图内的指针中,您需要包含标题,前方声明不够。