So here’s the situation: I’m using C++, SDL and GLConsole in conjunction. I have a class, SDLGame, which has the Init(), Loop(), Render() etc – essentially, it holds the logic for my game class.
GLConsole is a nice library so far – it lets me define CVars and such, even inside my SDL class. However, when defining commands, I have to specify a ConsoleFunc, which is typedef’d as
typedef bool (*ConsoleFunc)( std::vector<std::string> *args);
Simple enough. However, like I said, my functions are all in my class, and I know I can’t pass pointer-to-class-functions as pointer-to-function arguments. I can’t define static functions or make functions outside my class because some of these ConsoleFuncs must access class data members to be useful. I’d like to keep it OOP, since – well, OOP is nice.
Well, I actually have this problem “solved” – but it’s extremely ugly. I just have an instance of SDLGame declared as an extern variable, and use that in my ConsoleFuncs/main class.
So, the question is: Is there a way to do this that isn’t stupid and dumb like the way I am doing it? (Alternatively: is there a console library like GLConsole that supports SDL and can do what I’m describing?)
If the only interface you have is that function pointer, then you’re screwed.
A member function needs a
thispointer to be called, and if you have no way of passing that, you’re out of luck (I guess thestd::vector<std::string>* argspointer is what you get passed from the library).In other words, even though that library uses C++ containers, it’s not a good C++ library, because it relies on free functions for callbacks. A good C++ library would use
boost::functionor something similar, or would at the very least let you pass avoid* user_datapointer that gets passed through to your callback. If you had that, you could pass thethispointer of your class, cast it back inside the callback, and call the appropriate member function.