Попытка инициализировать карту, которая принимает объект в качестве значения в конструкторе

0

Я смотрю вокруг, пытаясь решить эту проблему, и ближайший я получил этот вопрос. Как вы инициализируете карту, которая берет структуру как значение? , однако, похоже, это не сработало. Если кто-нибудь знает о решении, я бы с удовольствием узнал, иначе я выложу свою проблему. Я хотел бы создать партию шахматных фигур, и для этого я создал класс "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. Если кто-то знает, как это осуществить, я бы хотел узнать, спасибо за любую помощь, которую вы можете мне дать!

  • 0
    Предоставляет ли Pawn реализации для всех чисто виртуальных методов, объявленных в Piece?
  • 0
    это было это! Я забыл реализовать виртуальные методы, спасибо за помощь!
Теги:
class
map

2 ответа

1
Лучший ответ

Ваш класс 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()
  • 0
    аааа да У меня есть чисто виртуальный метод, я не знал, что это проблема. Спасибо за помощь, я долго бился головой об стену. Я постараюсь добавить больше деталей в следующий раз. (извините, я не могу проголосовать, мой представитель слишком низкий!)
  • 0
    не беспокойтесь, как поживает ваш представитель?
Показать ещё 1 комментарий
0

В сообщении об ошибке указано, что вы не переопределили все абстрактные функции-члены из Piece. Убедитесь, что вы действительно переопределяете именно подпись абстрактной функции, а не аналогичную: типы аргументов и константа членов не могут отличаться.

Тем не менее, вы, вероятно, не должны использовать std::map<...> для представления своей доски! Использование двумерного массива (или одномерного массива с подходящими функциями доступа для строк и столбцов), вероятно, является лучшим выбором. Если вы настаиваете на использовании std::map<...>, рассмотрите использование ключа std::pair<int, int> или std::array<int, 2> as.

  • 0
    Спасибо за быстрый ответ! Я не думал, что это были мои виртуальные проблемы. Да, мой векторный метод довольно шаток, ваши предложения выглядят более надежными. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню