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

Attempting to initialise map that takes an object as value within a constructor

本文关键字:构造函数 映射 初始化 对象      更新时间:2023-10-16

我一直在四处寻找,试图解决这个问题,我最接近的问题是这个问题:如何初始化以结构为值的映射?,然而,它似乎不起作用。如果有人知道解决方案,那么我很想知道,否则我会解决我的问题。我想创建一批棋子,为此,我创建了一个类"ChessBoard"和一个类别"pieces",这是所有棋子和骑士等继承的超类。这是"ChessBoard.h")

    class ChessBoard {
protected:
    map< vector<int>, Piece* > chess_pieces;
public:
    ChessBoard();
};

现在我还有一个子类‘Piece’,它是‘Pawn’。我想指定一个类型为Pawn的元素作为棋子之一。因此,在棋盘构造器中,我有以下几条线:

    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;
    }
}

然而,编译器会给我一个警告,在"new Pawn"赋值时调用我,说我正在"分配抽象类类型为Pawn的对象"。这是不允许的吗?我用默认构造函数定义了"Pawn"类,"Piece"类也有默认构造函数。此外,我已经确保包括行

class Pawn: public Piece {

在Pawn类声明中。如果有人知道如何做到这一点,我很想知道,谢谢你们能给我的任何帮助!

您的类Piece必须在其中定义了一个纯虚拟方法。像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()

错误消息指出您尚未覆盖Piece中的所有抽象成员函数。确保您确实覆盖了抽象函数的签名,而不是类似的签名:参数类型和成员的常量不能不同。

也就是说,你可能不应该用std::map<...>来代表你的董事会!使用二维数组(或对行和列具有适当访问函数的一维数组)可能是更好的选择。如果您坚持使用std::map<...>,请考虑使用std::pair<int, int>std::array<int, 2>作为密钥。