2014-01-29 4 views
0

По какой-то причине я получаю эту ошибку, которая раньше не отображалась. Ошибка указывает, что объект абстрактного типа InitializeState не разрешен. Тем не менее, у меня не было этой проблемы раньше, и я не делал никаких изменений в обоих файлах. Вот файл заголовка:Объявление объекта C++ называется абстрактным

#ifndef InitializeState_h 
#define InitializeState_h 
#include "State.h" 
#include "SFML/Graphics.hpp" 


class InitializeState : public State{ 
    public: 
     void Load(sf::RenderWindow*); 
     //void Load(); 
     void Handling(SEngine* gameEng); 
     void Paint(SEngine* gameEng); 
     void Update(SEngine* gameEng); 
     void TidyUp(); 
     void Halt(); 
     void Continue(); 
     static InitializeState* Initialize(){ 
      return &gameStart; 
     } 


    protected: 
     InitializeState() {} 

    private: 
     static InitializeState gameStart; 
}; 


#endif 

Здесь C++ файл, в котором происходит ошибка:

#include "InitializeState.h" 
#include "State.h" 
#include "SEngine.h" 

#include <SFML/Graphics.hpp> 



InitializeState InitializeState::gameStart; 

void InitializeState::Load(sf::RenderWindow* window){ 
    rwindow = window; 
    rwindow->create(sf::VideoMode(200,200), "Working"); 
}; 

void InitializeState::Handling(SEngine* gameEng){ 

}; 

void InitializeState::Paint(SEngine* gameEng){ 


}; 

void InitializeState::Update(SEngine* gameEng){ 

}; 

void InitializeState::Continue(){ 
}; 

void InitializeState::Halt(){ 
}; 

Пятая строка кода, InitializeState InitializeState :: GameStart ;, где ошибка происходит.

Вот окно ошибки:

1>------ Build started: Project: 2D Game, Configuration: Debug Win32 ------ 
1> SEngine.cpp 
1>c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\sengine.cpp(26): error C2660: 'State::Handling' : function does not take 1 arguments 
1> Main.cpp 
1> InitializeState.cpp 
1>c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\initializestate.cpp(9): error C2259: 'InitializeState' : cannot instantiate abstract class 
1>   due to following members: 
1>   'void State::Handling(void)' : is abstract 
1>   c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(14) : see declaration of 'State::Handling' 
1>   'void State::Paint(void)' : is abstract 
1>   c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(15) : see declaration of 'State::Paint' 
1>   'void State::Update(void)' : is abstract 
1>   c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(16) : see declaration of 'State::Update' 
1> Generating Code... 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

и ошибка? – Samuel

+0

«Объект абстрактного типа InitializeState не допускается», как я сказал в верхней части сообщения. –

+0

Какой компилятор это?Вывод, как правило, более подробный, например, указывает, почему объект является абстрактным (как в «вы забыли реализовать метод X») – Samuel

ответ

0

Если вы реализуете

void State::Handling(void) override; 
void State::Paint(void) override; 
void State::Update(void) override; 

Из класса State вы будете прекрасно.

Изначально необходимо использовать ключевое слово virtual при переопределении, поскольку вы выполняете метод, скрывающий в противном случае.

Класс State требует, чтобы вы реализовали методы выше, независимо от любых похожих методов, которые вам нужны с различными сигнатурами, такими как ваш параметр SEngine.

Это базовое знание ООП, которого вам здесь не хватает. Я предлагаю прочитать книгу, такую ​​как «Мышление» на C++ 1 и 2, чтобы получить некоторое представление перед запутанностью с движком.

Редактировать: Еще одна проблема с кодом: Ваш деструктор должен быть по крайней мере, виртуальная, как вы наследуя и не используя запатентованную ключевое слово MS sealed. Вы можете или, вероятно, столкнуться с некоторыми утечками памяти.

Некоторые чтения: When to use virtual destructors?

Редактировать: Добавлен новый C++ 11 override сахара, удалены virtual. Узнал что-то новое :)

+1

'virtual' не требуется, и его следует заменить' override', если вы используете недавний компилятор. – Klaim

+0

На самом деле это не сработало, но это помогло мне определить актуальную проблему: видимо, методы в моем State.h были изменены случайно, чтобы они отличались от классов, которые их реализовали. У методов в State.h не было аргументов, поэтому мне просто пришлось добавить их обратно. –

+0

При переопределении вам не нужно добавлять 'virtual'. Вам нужно добавить его в объявление участника в базовом классе. Добавление его в производные типы необязательно, но использование 'override' позволит компилятору рассказать вам, если вы не можете переопределить по какой-либо причине (например, получение подписи). – juanchopanza

0

Ошибка указывает, что объект абстрактного типа InitializeState is не разрешен.

Это обычно означает, что некоторые части виртуальной чистой функции родителя типа не реализованы в дочерних элементах. В основном, вы пропустите некоторые определения функций в InitializeState.

1>c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\initializestate.cpp(9): error C2259: 'InitializeState' : cannot instantiate abstract class 
1>   due to following members: 
1>   'void State::Handling(void)' : is abstract 
1>   c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(14) : see declaration of 'State::Handling' 
1>   'void State::Paint(void)' : is abstract 
1>   c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(15) : see declaration of 'State::Paint' 
1>   'void State::Update(void)' : is abstract 
1>   c:\users\brandon\documents\visual studio 2010\projects\2d game\2d game\state.h(16) : see declaration of 'State::Update' 

Здесь вы можете увидеть список функций-членов из класса State, отсутствующих в классе InitializeState. Это связано с тем, что эти функции являются чисто виртуальными: они «требуются» для реализации хотя бы одного из дочерних классов.

Просто реализуйте их в InitializeState, и это устранит вашу проблему.

Смежные вопросы