Я смотрю вокруг, пытаясь решить эту проблему, и ближайший я получил этот вопрос. Как вы инициализируете карту, которая берет структуру как значение? , однако, похоже, это не сработало. Если кто-нибудь знает о решении, я бы с удовольствием узнал, иначе я выложу свою проблему. Я хотел бы создать партию шахматных фигур, и для этого я создал класс "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" со стандартным конструктором, а класс "Piece" также имеет конструктор по умолчанию. Кроме того, я включил строку
class Pawn: public Piece {
в объявлении класса Pawn. Если кто-то знает, как это осуществить, я бы хотел узнать, спасибо за любую помощь, которую вы можете мне дать!
Ваш класс Piece должен был определить в нем чистый виртуальный метод. что-то вроде virtual int foo() = 0;
вам нужно будет внедрить все чистые виртуальные методы из класса Piece в нашем классе 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>
as.