我一直在寻找解决这个问题的方法,而我得到的最接近的是这个问题How do you initialize a map which takes a struct as value?,但它似乎没有用。 如果有人知道解决方案,那么我很想知道,否则我会解决我的问题。我想创建一批国际象棋棋子,为此,我创建了一个类'ChessBoard'和一个类'Pieces',这是一个超级类,所有的棋子和骑士等继承。这是“ChessBoard.h”)
class ChessBoard {
protected:
map< vector<int>, Piece* > chess_pieces;
public:
ChessBoard();
};
现在我还有一个'Piece'的子类,即'Pawn'。我想将Pawn类型的元素指定为chess_pieces之一。所以,在棋盘构造函数中,我有以下几行:
ChessBoard::ChessBoard()
{
/* Initialise white pieces */
/* First we set up the pawns: */
for (int j = 0; j < 8; j++) {
vector<int> v = {1, j};
chess_pieces[v] = new Pawn;
}
}
然而,编译器给了我一个警告,叫我“新Pawn”赋值,说我是'分配一个抽象类类型Pawn的对象'。这是不允许的?我用默认构造函数定义了'Pawn'类,而'Piece'类也有默认构造函数。另外,我已确保包含该行
class Pawn: public Piece {
Pawn类声明中的。 如果有人知道如何实现这一目标,我很想知道,感谢你们的帮助,你们可以给我!
答案 0 :(得分:1)
你的类必须在其中定义一个纯虚方法。像virtual int foo() = 0;
之类的东西你需要在我们的类Pawn中实现类Piece中的所有纯虚方法,以便'new Pawn`能够工作。
最好在您的问题中尽可能详细地提供,或者其他人必须猜测您的真实问题。
这是一个快速示例程序,用于说明编译器的问题和输出:
class Piece
{
public:
Piece() {}
virtual ~Piece() {}
virtual int foo() = 0;
};
class Pawn: public Piece
{
};
int main(int argc, char *argv)
{
Pawn *p = new Pawn;
delete p;
return 0;
}
:!g++ virtual.cpp
virtual.cpp: In function ‘int main(int, char*)’:
virtual.cpp:16: error: cannot allocate an object of abstract type ‘Pawn’
virtual.cpp:11: note: because the following virtual functions are pure within ‘Pawn’:
virtual.cpp:7: note: virtual int Piece::foo()
答案 1 :(得分:0)
错误消息指出您尚未覆盖Piece
中的所有抽象成员函数。确保你确实完全覆盖抽象函数的签名而不是类似的签名:参数类型和成员的常量不能有所不同。
那就是说,你可能不应该使用std::map<...>
代表你的董事会!使用二维数组(或具有适合行和列的访问函数的一维数组)可能是更好的选择。如果您坚持使用std::map<...>
,请考虑使用std::pair<int, int>
或std::array<int, 2>
作为密钥。