Can i declare an "empty function" for the class that i fill differently depending on the game?
At compile time? Sure - just declare the function in the engine's header files, but only define it in the game-specific source files.
//MyClass.h - Engine header file
class MyClass
{
public:
void function();
void gameSpecificFunction();
};
.
//MyClass.cpp - Engine source file
void MyClass::function()
{
//Code....
}
.
//MyClass_Game.cpp - Game-specific source file.
void MyClass::gameSpecificFunction()
{
//Code....
}
.
If you mean at runtime you want the function to change? Sure - just use function pointers.
typedef std::function<void(float,int)> MyFunction;
class MyClass
{
public:
void SetFunctionToUse(MyFunction function) { functionToCall = function; }
void CallFunction(float myFloat, int myInt)
{
//Check if a function has been set.
if(functionToCall)
{
//If so, call the function.
functionToCall(myFloat, myInt);
}
}
private:
MyFunction functionToCall;
};
.
And maybe also add some game-specific variables?
Well, that's slightly more difficult, but yes. You can use the pImpl idiom very effectively for this.
//MyClass.h - Engine header file
class MyClass
{
public:
void function();
void gameSpecificFunction();
private:
int normalVariable;
//The game-specific variables don't go here yet.
private:
//We tell the compiler a class called 'MyClass::Implementation' exists, but we don't define it yet.
//This is a class within a class (in terms of namespace).
class Implementation;
std::unique_ptr<Implementation> pImpl; //A pointer to the 'Implementation' class that we haven't yet defined.
};
.
//MyClass.cpp - Engine source file
//I'm including a _source_ file here, not a header file.
#include "../Game/MyClass_Implementation.cpp"
MyClass::gameSpecificFunction()
{
//Call the Implementation's version of the function.
pImpl->realFunction();
}
.
//MyClass_Implementation.cpp - Game-specific source file
//NOW we define MyClass::Implementation.
//I like to make pImpl's be 'structs' since they are public by default.
struct MyClass::Implementation
{
//Game-specific variables.
int meow = 357;
//Game-specific function implementation
void realFunction()
{
//...code...
}
};
.
However, using these in some situations may indicate bad architecture - I would give it some serious thought and ask myself what I am actually needing, why I'm needing it, and what would be the best way to implement it.