出于某种原因,我收到的错误以前没有显示过。该错误表明不允许抽象类型InitializeState的对象。但是,之前我没有遇到过此问题,而且我没有对这两个文件进行任何更改。 这是头文件:
#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 :(得分:0)
如果您实施
void State::Handling(void) override;
void State::Paint(void) override;
void State::Update(void) override;
从班级State
你会没事的。
在覆盖时需要使用virtual
关键字,否则执行方法隐藏。
课程State
要求您实施上述方法,无论您使用SEngine
参数等不同签名所需的任何类似方法。
这是你在这里缺乏的基本OOP知识。我建议你读一本像Thinking in C ++ 1和2这样的书,以便在弄乱引擎之前先了解一下。
编辑:您的代码的另一个问题:您继承的析构函数必须至少是虚拟的,而不是使用MS专有关键字sealed
。你可能会或者可能会在这里遇到一些内存泄漏。
一些阅读:When to use virtual destructors?
修改:添加了新的c ++ 11 override
糖,删除了virtual
。学到了新东西:)
答案 1 :(得分:0)
错误是声明抽象类型InitializeState的对象是 不允许。
这通常意味着类型父级的某些虚拟纯函数未在子级中实现。基本上,你错过了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'
在这里,您可以看到Stateize类中缺少InitializeState类的成员函数列表。这是因为这些函数是纯虚函数:它们是“必需”由至少一个子类实现的。
只需在InitializeState中实现它们即可解决您的问题。