试图初始化将对象作为构造函数内值的映射
Attempting to initialise map that takes an object as value within a constructor
我一直在四处寻找,试图解决这个问题,我最接近的问题是这个问题:如何初始化以结构为值的映射?,然而,它似乎不起作用。如果有人知道解决方案,那么我很想知道,否则我会解决我的问题。我想创建一批棋子,为此,我创建了一个类"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>
作为密钥。
- std::映射,只有move构造函数可用
- 重载调用是不明确的:一对内联映射作为构造函数参数
- 映射构造函数,同时在C++中实现计数器
- 在类构造函数中初始化映射时,如何避免内存泄漏
- 如何将映射从类构造函数传递到类中的另一个函数
- C++构造函数期间向映射添加"self"
- SWIG 多参数类型映射适用于函数,但如果有多个构造函数,则不适用于构造函数
- 具有私有构造函数和自身静态容器(映射)的对象
- 多映射插入键类型信息 std::make_pair vs std::p air 构造函数
- 不可复制的对象、映射和shared_ptr:复制构造函数中出错
- C++将带有构造函数的对象插入到映射中
- 为什么映射上的std::for_each调用复制构造函数
- 缺少用于映射初始化的构造函数
- 为什么我的结构中映射的构造函数不起作用
- 具有带参数的构造函数的自定义类的映射
- std::映射和私有构造函数
- 如何使用move构造函数正确处理shared_ptr的映射
- 试图初始化将对象作为构造函数内值的映射
- 通过引用将 std::map 传递给不更新映射的类的构造函数
- c++构造函数映射对象(已编辑)