Hey guys,
I'm writing a simple abstraction layer between my game and the render-engine. Unfortunately, I ran into a problem: I can't manage to cast an abstract class to its subclass implementation. (Seriously, Java Interfaces & Abstract classes were so much easier....)
First things first: Basically I want to substitute the render-engine initiationcall
oxygine::core::init(&oxygine::core::init_desc);
with my abstract function
GraphicsFactory::initRenderEngine(GraphicsFactory::createInitiationSettings(args));
Here is my code:
IInitationSettings.h
#pragma once
class IInitiationSettings {
public:
virtual void setTitle(const char* title) = 0;
virtual void setVsync(bool vsync) = 0;
virtual void setFullscreen(bool fullscreen) = 0;
virtual void setWidth(int width) = 0;
virtual void setHeight(int height) = 0;
};
IInitationSettings.cpp
#include "IInitiationSettings.h"
OxygineInitiationSettings.h
#pragma once
#include "IInitiationSettings.h"
#include "core/oxygine.h"
class OxygineInitiationSettings : public IInitiationSettings, public oxygine::core::init_desc {
public:
OxygineInitiationSettings();
OxygineInitiationSettings(const char* title, bool vsync, bool fullscreen, int width, int height);
void setTitle(const char* title);
void setVsync(bool vsync);
void setFullscreen(bool fullscreen);
void setWidth(int width);
void setHeight(int height);
};
OxygineInitiationSettings.cpp
#include "OxygineInitiationSettings.h"
OxygineInitiationSettings::OxygineInitiationSettings() : OxygineInitiationSettings("No title specified", true, true, 500, 500){}
OxygineInitiationSettings::OxygineInitiationSettings(const char* title, bool vsync, bool fullscreen, int width, int height) : oxygine::core::init_desc() {
this->title = title;
this->vsync = vsync;
this->fullscreen = fullscreen;
this->w = width;
this->h = height;
}
void OxygineInitiationSettings::setTitle(const char* title){
this->title = title;
}
void OxygineInitiationSettings::setVsync(bool vsync){
this->vsync = vsync;
}
void OxygineInitiationSettings::setFullscreen(bool fs){
this->fullscreen = fs;
}
void OxygineInitiationSettings::setWidth(int w){
this->w = w;
}
void OxygineInitiationSettings::setHeight(int h){
this->h = h;
}
And finally, the code in GraphicsFactory (Only the relevant code from both the header and the .cpp):
static void init(IInitiationSettings& initSettings);
static IInitiationSettings& createInitiationSettings(const char* title, bool vsync, bool fullscreen, int width, int height);
IInitiationSettings& GraphicsFactory::createInitiationSettings(const char* title, bool vsync, bool fullscreen, int width, int height){
#ifdef USE_OXYGINE_RENDERING
return OxygineInitiationSettings(title, vsync, fullscreen, width, height);
#endif
}
void GraphicsFactory::init(IInitiationSettings& initSettings){
#ifdef USE_OXYGINE_RENDERING
OxygineInitiationSettings settings = dynamic_cast<OxygineInitiationSettings&>(initSettings);
oxygine::core::init(&settings);
//THESE TWO LINES DON'T WORK. I just can't cast the IInitiationSettings, which in reality IS
//a OxygineInitiationSettings-Instance, to OxygineInitiationSettings...
#endif
}
The error is in the GraphicsFactory::init implementation. Since USE_OXYGINE_RENDERING is defined, I can safely assume that initSettings is of the type OxygineInitiationSettings, and thus I want to cast it to that - Which isn't working...
Would be awesome if someone could help.
Kind regards