'MenuState' : cannot instantiate abstract class
Beginning SDL Part 4 - State Manager
#31
Posted 23 February 2012 - 07:04 PM
#32
Posted 24 February 2012 - 08:44 AM
Amb154, are you trying to new the MenuState class anywhere? This will not work as the class is a singleton. Please post your code so I can diagnose
#33
Posted 24 February 2012 - 11:05 AM
#include <stdio.h> #include "SDL.h" #include "Game.h" #include "MenuState.h" MenuState MenuState::m_MenuState;
That's from MenuState.cpp
And it says that "Object of abstract class type 'MenuState' is not allowed".
I'm trying it with all the code you posted and it's still not working. It might be a problem in game.h/cpp or something else, but i don't see how that could be possible.
#34
Posted 24 February 2012 - 11:11 AM
Amb154, on 24 February 2012 - 11:05 AM, said:
#include <stdio.h> #include "SDL.h" #include "Game.h" #include "MenuState.h" MenuState MenuState::m_MenuState;
That's from MenuState.cpp
And it says that "Object of abstract class type 'MenuState' is not allowed".
I'm trying it with all the code you posted and it's still not working. It might be a problem in game.h/cpp or something else, but i don't see how that could be possible.
Small tip.. indepedent to your error.
Try getting all the classes in one file with a correct order.
Sometimes header and cpp files defining sucks in C++.. i have spent a lot of hours in debugging different errors because of define declaration problems.
#35
Posted 24 February 2012 - 11:48 AM
main.cpp
#include "cEngine.h"
int main(int argc, char* argv[])
{
cEngine Engine;
Engine.init( "Game Engine", 640, 480, 32, false );
while( Engine.running() )
{
Engine.handleEvents();
Engine.update();
Engine.draw();
}
Engine.cleanUp();
return 0;
}
cEngine.cpp
#include "cEngine.h"
#include "cGameState.h"
cEngine::cEngine()
{
}
void cEngine::init( const char* title, int width, int height, int bpp, bool fullscreen )
{
int flags = 0;
//Init SDL
SDL_Init( SDL_INIT_EVERYTHING );
//Set the title bar text
SDL_WM_SetCaption( title, NULL );
//Set Icon
SDL_WM_SetIcon( IMG_Load( "img//icon//icon.gif" ), NULL );
//Check if fullscreen
if( fullscreen )
{
flags = SDL_FULLSCREEN;
}
//Create screen surface
m_pScreen = SDL_SetVideoMode( width, height, bpp, flags );
m_bFullscreen = fullscreen;
m_bRunning = true;
}
void cEngine::changeState( cGameState* state )
{
//Clenup the current state
if( !states.empty() )
{
states.back()->cleanUp();
states.pop_back();
}
//Store and init the new state
states.push_back( state );
states.back()->init();
}
void cEngine::pushState(cGameState* state)
{
// pause current state
if ( !states.empty() ) {
states.back()->pause();
}
// store and init the new state
states.push_back( state );
states.back()->init();
}
void cEngine::popState()
{
// cleanup the current state
if ( !states.empty() ) {
states.back()->cleanUp();
states.pop_back();
}
// resume previous state
if ( !states.empty() ) {
states.back()->resume();
}
}
bool cEngine::running()
{
return m_bRunning;
}
void cEngine::handleEvents()
{
//State handle events
states.back()->handleEvents( this );
}
void cEngine::update()
{
// let the state update the game
states.back()->update( this );
}
void cEngine::draw()
{
//state draw the screen
states.back()->draw( this );
}
void cEngine::cleanUp()
{
while ( !states.empty() ) {
states.back()->cleanUp();
states.pop_back();
}
// shutdown SDL
SDL_Quit();
}
void cEngine::quit()
{
m_bRunning = false;
}
cEngine.h
#ifndef _CENGINE_H_
#define _CENGINE_H_
#include <SDL.h>
#include <string>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include "cSprite.h"
#include "cTimer.h"
#include <vector>
#include <iostream>
class cGameState;
class cEngine
{
public:
cEngine();
void init( const char* title, int width, int height, int bpp, bool fullscreen );
void changeState( cGameState* state );
void pushState( cGameState* state );
void popState();
bool running();
void handleEvents();
void update();
void draw();
void cleanUp();
void quit();
private:
//States
std::vector<cGameState*> states;
//Runntime variables
bool m_bRunning;
bool m_bFullscreen;
SDL_Surface* m_pScreen;
};
#endif
cGameState.h
#ifndef _CGAMESTATE_H_
#define _CGAMESTATE_H_
#include "cEngine.h"
class cGameState
{
public:
virtual void init() = 0;
virtual void cleanUp() = 0;
virtual void pause() = 0;
virtual void resume() = 0;
virtual void handleEvents( cEngine* Engine ) = 0;
virtual void update( cEngine* Engine ) = 0;
virtual void draw( cEngine* Engine ) = 0;
void changeState( cEngine* Engine, cGameState* state )
{
Engine->changeState( state );
}
protected:
cGameState() {}
};
#endif
#36
Posted 25 February 2012 - 08:57 AM
At the point you don't have any states in the stack so it throws an access violation due to the states list being empty. Keep following the tutorials and this error will go away
#37
Posted 11 May 2012 - 07:12 PM
Is there something I am doing wrong with this line? I have gone through the tutorial 10 times and I cant get it right. This line shows an error message: undefined reference to MenuState::MenuState()
#38
Posted 12 May 2012 - 03:23 AM
gamer27lv, on 11 May 2012 - 07:12 PM, said:
Is there something I am doing wrong with this line? I have gone through the tutorial 10 times and I cant get it right. This line shows an error message: undefined reference to MenuState::MenuState()
**FIXED**
in my menustate.h file, I had the constructor wrong, I had MenuState(); instead of MenuState(){}
#39
Posted 12 May 2012 - 06:49 AM
I can't see it..
#40
Posted 13 May 2012 - 01:13 AM
gamer27lv, on 12 May 2012 - 06:49 AM, said:
I can't see it..
I do kind of see it... but the problem I have with understanding it is that in the handleEvent section of the state classes, where the new states are called... the ChangeState function is only taking in 1 parameter ChangeState(StateLevelOne->Instance() for example. but within the GameState.h file, there is a void ChangeState function taking in 2 parameters, I know this is not a virtual function, so I don't think they are the same.. but where is the one with 2 parameters used?? and why?
#41
Posted 06 December 2012 - 03:22 AM
menustate.cpp(6): error C2259: 'MenuState' : cannot instantiate abstract class 1> due to following members: 1> 'void GameState::Cleanup(void)' : is abstract
I have tried and followed the tutorial lots of times, but i dont seem to see where the problem lies.
#42
Posted 06 December 2012 - 03:28 AM
Thanks
#43
Posted 06 December 2012 - 03:33 AM
stayscrisp, on 06 December 2012 - 03:28 AM, said:
Thanks
Sure
Gamestate.h:
#ifndef GAMESTATE_H
#define GAMESTATE_H
#include "Game.h"
class GameState
{
public:
virtual void Init() = 0;
virtual void Cleanup() = 0;
virtual void Pause() = 0;
virtual void Resume() = 0;
virtual void HandleEvents(Game* game ) = 0;
virtual void Update(Game* game) = 0;
virtual void Draw(Game* game) = 0;
void ChangeState(Game* game, GameState* state)
{
game->ChangeState(state);
}
protected:
GameState() {}
};
#endif
Menustate.h
#ifndef MENUSTATE_H
#define MENUSTATE_H
#include <SDL.h>
#include "GameState.h"
#include "Sprite.h"
class MenuState : public GameState
{
public:
void Init();
void Clean();
void Pause();
void Resume();
void HandleEvents(Game* game);
void Update(Game* game);
void Draw(Game* game);
// implement Singleton Pattern
static MenuState* Instance()
{
return &m_MenuState;
}
protected:
MenuState(){}
private:
static MenuState m_MenuState;
SDL_Surface* menuSprite;
};
#endif
Menustate.cpp
#include <stdio.h>
#include <SDL.h>
#include "Game.h"
#include "MenuState.h"
MenuState MenuState::m_MenuState;
void MenuState::Init()
{
menuSprite = NULL; // set pointer to NULL;
menuSprite = Sprite::Load("menusprite.png"); // load menu state image
}
void MenuState::Clean()
{
printf("MenuState Clean Successful\n");
}
void MenuState::Pause()
{
printf("MenuState Paused\n");
}
void MenuState::Resume()
{
printf("MenuState Resumed\n");
}
void MenuState::HandleEvents(Game* game)
{
SDL_Event event;
if( SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT: game->Quit(); break;
}
}
}
void MenuState::Update(Game* game)
{
}
void MenuState::Draw(Game* game)
{
Sprite::Draw(game->GetScreen(), menuSprite, 0, 0);
SDL_Flip(game->GetScreen());
}
Hope u can help me
#44
Posted 06 December 2012 - 03:44 AM
The error above is the compiler telling you that it has an abstract function that needs to be implemented in all derived classes. This one was simply named wrong
#45
Posted 06 December 2012 - 03:49 AM
stayscrisp, on 06 December 2012 - 03:44 AM, said:
The error above is the compiler telling you that it has an abstract function that needs to be implemented in all derived classes. This one was simply named wrong
Ah! that might have solved it, though iam now getting another error, which might not have with this tutorial to do:
MenuState.obj : error LNK2019: unresolved external symbol "public: static struct SDL_Surface * __cdecl Sprite::Load(char *)" (?Load@Sprite@@SAPAUSDL_Surface@@PAD@Z) referenced in function "public: virtual void __thiscall MenuState::Init(void)" (?Init@MenuState@@UAEXXZ) 1>C:\Users\Robin\documents\visual studio 2010\Projects\GEProject\Debug\GEProject.exe : fatal error LNK1120: 1 unresolved externals
I did get lots of external linker errors before when i used visual studio express 2012, but not when i re did the whole code in visual studio express 2010, and havn't recieved some linker errors until now
|
|





MultiQuote



|