viraj viraj - 1 year ago 126
C++ Question

Pointing to a function that is a class member - glfw setKeycallback

I'm writing a glfw app, in which I've wrapped the function callse into a simple class. Im having trouble setting the key callback.
My class is defined as:

class GAME
{
private:
bool running;
public:
GAME();
int execute();
void events(int, int);
int loop();
int render();
};


The execute function is:

int GAME::execute()
{
glfwOpenWindow(640, 320, 8, 8, 8, 8, 0, 0, GLFW_WINDOW);
glfwSetWindowTitle("Viraj");
glfwSetKeyCallback(events);
running = true;
while(glfwGetWindowParam(GLFW_OPENED))
{
glfwPollEvents();
loop();
render();
}
return 0;
}


Compiling the following code on Visual Studio 2010, gives the error:

error C3867: 'GAME::events': function call missing argument list; use '&GAME::events' to create a pointer to member


Using &GAME::events gives:

error C2664: 'glfwSetKeyCallback' : cannot convert parameter 1 from 'void (__thiscall GAME::* )(int,int)' to 'GLFWkeyfun'
1> There is no context in which this conversion is possible

Answer Source

There is a C++ syntax for pointing to class member methods but you cannot pass them to a C style API. C understands function calls and every non-static object method, taking your events as an example, looks like this thinking in C terms: void events(void* this, int, int); meaning that every method apart from the standard arguments also gets a this pointer silently passed.

To make your events C compatible make it static void events(int, int);. This way it will follow the C calling semantics - it will not require a this pointer getting passed. You have to also somehow pass your object to this callback in some other manner (if you need this object's data in the callback).

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download