#c #visual-studio-2010
#c #visual-studio-2010
Вопрос:
Я программирую шахматную доску, и у меня есть шахматная фигура базового класса (schaakstuk на моем языке), и все фигуры, такие как король, королева, являются производными от этого базового класса.
Теперь я хотел создать объект и заполнить массив объектами, чтобы начать игру. Visual studio выдает мне некоторые ошибки в этой строке:
bord[1][kolom] = new Schaakstuk(Schaakstuk::WIT);
bord[6][kolom] = new Pion(Schaakstuk::ZWART);
что невозможно создать из абстрактного класса. Я не вижу ошибки, сначала я подумал, что я использую чисто виртуальную функцию в своем производном классе, но это не так, я использую только чисто виртуальную функцию в своем базовом классе.
Конструктор
for( int kolom = 0; kolom < SIZE; kolom )
{
bord[1][kolom] = new Pion(Schaakstuk::WIT);
bord[6][kolom] = new Pion(Schaakstuk::ZWART);
}
Pion.h
#include "Schaakstuk.h"
#include "Exceptions.h"
#ifndef PION
#define PION
class Pion: public Schaakstuk
{
public:
Pion(void);
~Pion(void);
bool ZetIsLegaal( int rij1, int kolom1, int rij2, int kolom2 ) const;
void PrintStuk( void ) const;
void GeefCor( int tabel [8][2], int rij, int kolom, int rij1, int kolom1) const;
bool IsPion( void ) const { return true; };
private:
bool ControleerZet( int rij1, int kolom1, int rij2, int kolom2 ) const;
};
#endif
Schaakstuk.h
#ifndef SCHAAKSTUK
#define SCHAAKSTUK
static const int SIZE1 = 8;
class Schaakstuk
{
public:
enum kleurType { WIT, ZWART };
Schaakstuk(kleurType kleur = WIT)
{
this->kleur = kleur;
};
virtual bool ZetIsLegaal( int rij1, int kolom1, int rij2, int kolom2 ) = 0;
virtual void PrintStuk( void ) = 0;
virtual void GeefCor( int tabel [8][2], int rij, int kolom, int rij1, int kolom1) = 0;
kleurType GeefKleur( void ) const { return kleur; };
virtual bool IsPion( void ) = 0;
protected:
bool static NietOutOfBounds( int rij, int kolom );
private:
kleurType kleur;
};
#endif
это мой dropbox с файлами кода. Кто-нибудь может мне помочь?
это ошибки:
и вот полный код
Комментарии:
1. Я чертовски уверен, что не загружаю файл RAR из Dropbox какого-то неизвестного пользователя.
2. Отправьте тестовый пример в ideone.com .
3. Пожалуйста, укажите свои объявления классов в вашем вопросе, но, судя по вашим ошибкам, у вас есть чисто виртуальные функции
Pion
, и если это правда, вы не можете создать новый экземплярPion
напрямую, только один из его подклассов, который реализует все чистые виртуальные объекты и не является абстрактным.4. Самое лучшее в создании тестового примера — это то, что по пути вы, скорее всего, сами обнаружите ошибку.
Ответ №1:
Если ошибка соответствует строкам «Невозможно создать экземпляр абстрактного класса», то в следующей строке должно быть указано, какой метод является абстрактным.
Скорее всего, вы объявили чистый виртуальный класс в базовом классе, но не переопределили его (или переопределили его должным образом; см. Ниже) в производном классе.
Сначала убедитесь, что у вас есть переопределение в Schaakstuk
и Pion
, а затем убедитесь, что вы вообще не изменили подпись. Это может быть другая квалификация const / volatile или другие параметры метода.
Комментарии:
1. Судя по вашему сообщению об ошибке, это проблема. Вы должны реализовать все свои чисто виртуальные функции в дочернем классе, и подписи должны точно совпадать.
2. Спасибо, нашел ошибку. потребовалось const = 0 😉 Теперь все работает нормально.
Ответ №2:
Слово «абстрактный» — это отдача. Вам нужно создать из конкретного класса, то есть компилятор должен знать все о входах и выходах этого объекта.
Комментарии:
1. Джон, он содержит только файлы .cpp .h.