尝试初始化将对象作为构造函数中的值的映射

时间:2013-11-22 23:36:44

标签: c++ class map

我一直在寻找解决这个问题的方法,而我得到的最接近的是这个问题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类声明中的

。 如果有人知道如何实现这一目标,我很想知道,感谢你们的帮助,你们可以给我!

2 个答案:

答案 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>作为密钥。