我试图使用地图创建一个国际象棋游戏,并有一个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?请在答案中保留地图的使用(即使它不是国际象棋的最佳选择)。
答案 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
添加到地图内的指针中,您需要包含标题,前方声明不够。