Как мне использовать массив абстрактных объектов?Неверная ошибка абстрактного типа - PullRequest
1 голос
/ 24 июня 2019

Я пишу шахматы на C ++, а Player имеет массив из 16 штук , который является абстрактным классом для каждой отдельной фигуры (лошадь, пешка)., король и т.д ..).Компилятор выдает мне «недопустимый абстрактный тип Peca» для «pecas». Что я делаю не так? Спасибо!

Player.h

#include "Peca.h" // Includes Piece abstract class

using std::string;

class Jogador
{
    private:
        static int numeroDeJogador; //PlayerNumber (0-1)
        string nome;
        Peca pecas[16]; //This is the array of the abstract class Pecas (Pieces), where i want to put derived objects like Horse, king..

    public:
        string getNomeJogador(); // Return the player name

};

Pieces.h

#ifndef PECA_H
#define PECA_H
#include <string>

using std::string;

class Peca {

    private:
        int cor; //0 para as brancas, 1 para as pretas
        bool emJogo;

    public:
        Peca(int cor);
        virtual string desenha() = 0;
        virtual bool checaMovimento(int linhaOrigem, int colunaOrigem, int linhaDestino, int colunaDestino) = 0;
        int getCor();
        bool estaEmJogo();
        void setForaDeJogo(bool estado);
};
#endif

Пример производного класса:

#include "Peca.h"

using std::string;

class Cavalo : public Peca {
    public:
        Cavalo(int cor);
        bool checaMovimento(int linhaOrigem, int colunaOrigem, int linhaDestino, int colunaDestino);
        string desenha();
};

1 Ответ

6 голосов
/ 24 июня 2019

Массив требует, чтобы объекты массива были конструируемыми. Вы не можете создать Peca, поэтому у вас не может быть их массива.

Вам нужен контейнер указателей на Peca. Указатели всегда конструируемы, даже если то, на что они указывают, не может быть. В этом случае вы можете использовать std::array<std::unique_ptr<Peca>, 16> pecas, чтобы у вас был массив управляемых указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...