【发布时间】:2019-03-05 02:13:22
【问题描述】:
谁能帮帮我?
我现在有这个问题,无法解决。
不允许抽象类类型的对象:纯虚函数没有覆盖器'
我在下面突出显示:
class State
{
public:
virtual void Update() = 0;
virtual void Render();
virtual void Enter() = 0;
virtual void Exit() = 0;
virtual void Resume() = 0;
protected:
State() {}
};
class GameState : public State
{
private:
Level level;
Level levels[5] = { Level(3), Level(1), Level(1), Level(2), Level(1) };
const char* levelNames[5] = { "Level1.txt", "Level2.txt", "Level3.txt", "Level4.txt", "Level5.txt" };
SDL_Texture* tileText;
SDL_Texture* playerText;
Player player;
SDL_Surface* tileSurf;
SDL_Surface* playerSurf;
int m_iTickCtr = 0;
int m_iTickMax = 1; // for animation
public:
GameState() {}
void Update(Level& l, Player& p, int& c) ; // Level& level, Player& player, int& c
void Render(Level& l, Player& p);
void Enter();
void Exit();
void Resume() { cout << "Resuming Game..." << endl; }
enum sfx { jump, boom, laser };
};
class TitleState : public State
{
public:
TitleState() {}
virtual void Update();
void Render();
void Enter();
void Exit();
void Resume() {}
enum btn { play, exit };
private:
vector<Button*> m_vButtons;
};
void TitleState::Update()
{
/*
if (Game::Instance()->KeyDown(SDL_SCANCODE_B) == 1)
Game::Instance()->GetAM()->PlaySound(sfx::boop);
*/
for (int i = 0; i < (int)m_vButtons.size(); i++)
m_vButtons[i]->Update();
// Parse buttons.
if (m_vButtons[btn::play]->Clicked())
Game::Instance()->GetFSM()->ChangeState(new GameState()); // here 'GameState' has problems.
else if (m_vButtons[btn::exit]->Clicked())
Game::Instance()->DoQuit();
}
【问题讨论】:
-
是的,因为
GameState没有实现几个抽象函数,所以您不能使用new或任何其他方式构造GameState对象的新实例;那么,您要问的抽象(又名纯虚拟)方法的基本属性到底是什么?仅通过观察显示的代码,GameState无法实现Update()和Render(),因此要么实现它们,要么创建一些其他实现它们的对象。就是这样。 -
你应该用
override注释你所有的覆盖,然后你会很快发现问题。 -
不要忘记 C++ 中的优秀函数重载:
void Update()和void Update(Level&, Player&, int&)是不同的函数。在GameState中将override说明符添加到您的函数中会受益匪浅。