Почему этот класс не объявляет какие-либо чисто виртуальные функции-члены абстрактными? - PullRequest
2 голосов
/ 15 декабря 2011

Как следующий класс Game абстрактный? И как мне сделать его конкретным, чтобы я мог создать его экземпляр?

game.h

#include <JApp.h>
#include <JGE.h>

class Game: public JApp
{    
private: 
    JGE* Engine;
    int x, y, x2, y2;
public:
    Game(JGE *engine);
    virtual ~Game();
    virtual void Create();
    virtual void Destroy();
    virtual void Update();
    virtual void Render();
};

main.cpp

//Other headers
#include "game.h"
int main(void)
{
    JGE* engine = NULL;
    SetupCallbacks();
    engine = JGE::GetInstance();
    engine->printf("Starting Game!");
    Game* g = new Game(engine); // Error 'Game is an abstract type 
    engine->SetApp(g);
    engine->Run();
    engine->Destroy();

    sceKernelExitGame();
}

Game::Game(JGE* engine) : JApp(engine)
{
    Engine = engine;
    x = 0;
    x2 = 100;
    y = 0;
    y2 = 100;
}
void Game::Update()
{
    if (this->Engine->GetButtonClick(PSP_CTRL_UP))
    {
        x2 += 1;
        y2 += 1;

    }
    else if(this->Engine->GetButtonClick(PSP_CTRL_DOWN))
    {

        y2 += 10;
        y += 10;
    }
}
void Game::Create()
{    
}
void Game::Render()
{
     JRenderer* renderer = JRenderer::GetInstance();
     renderer->DrawLine(x, y, x2, y2, ARGB(0, 0, 0, 255));
}
Game::~Game()
{       
}
void Game::Destroy()
{   
}

P.S. Любое объяснение будет полезно, так как я не эксперт в объектно-ориентированном программировании.

Вот сообщение об ошибке вместе с некоторыми другими вещами:

1>------ Build started: Project: PSP Pong, Configuration: Debug Win32 ------
1>  psp-g++ -I. -Ic:/pspsdk/psp/sdk/include -O2 -G0 -Wall  -I. -Ic:/pspsdk/psp/sdk/include -O2 -G0 -Wall  -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150   -c -o main.o main.cpp
1>  main.cpp: In function 'int main()':
1>main.cpp(57): error : cannot allocate an object of abstract type 'Game'
1>  game.h (5) : note:   because the following virtual functions are pure within 'Game':
1>  c:/pspsdk/psp/sdk/include/JApp.h (78) : note:   virtual void JApp::Pause()
1>  c:/pspsdk/psp/sdk/include/JApp.h (84) : note:   virtual void JApp::Resume()
1>  main.cpp: In constructor 'Game::Game(JGE*)':
1>main.cpp(66): error : no matching function for call to 'JApp::JApp(JGE*&)'
1>  c:/pspsdk/psp/sdk/include/JApp.h (26) : note: candidates are: JApp::JApp()
1>  c:/pspsdk/psp/sdk/include/JApp.h (22) : note:                 JApp::JApp(const JApp&)
1>  c:\pspsdk\bin\make: *** [main.o] Error 1
1>  Press any key to continue . . . 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.MakeFile.Targets(38,5): error MSB3073: The command "c:\pspsdk\bin\vsmake.bat" exited with code -1.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

1 Ответ

8 голосов
/ 15 декабря 2011

JApp имеет чисто виртуальные функции, которые вы должны реализовать в своем классе.Поскольку вы их не реализовали, ваш класс неполон.

Пример, иллюстрирующий проблему:

struct B
{
    // this function is pure-virtual and
    // must be implemented in order to instantiate
    virtual void fn() = 0;
};

struct C : public B
{
    // missing implementation of fn().
    // as of now, this class is abstract because fn()
    // has no definition.
};

...

// try to instantiate...
C myobj;// this line produces error C2259: 'C' : cannot instantiate abstract class
...