# Is it possible to put cbfun's into a class?

**URL:** <https://discourse.glfw.org/t/is-it-possible-to-put-cbfuns-into-a-class/50>\
**Category:** support\
**Created:** [March 13, 2014, 7:17am UTC](https://discourse.glfw.org/t/is-it-possible-to-put-cbfuns-into-a-class/50 "2014-03-13T07:17:28Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![system](https://canada1.discourse-cdn.com/flex035/uploads/glfw/original/1X/b8cdefe6b61b8d5aee6c43b2c56e9cf5eabecfe4.svg) [@system](https://discourse.glfw.org/u/system)\
**Post date:** [March 13, 2014, 7:17am UTC](https://discourse.glfw.org/t/is-it-possible-to-put-cbfuns-into-a-class/50/1 "2014-03-13T07:17:28Z")

</div>

**[q66680](https://sourceforge.net/u/q66680/)** wrote on [Thursday, March 13, 2014](https://sourceforge.net/p/glfw/discussion/247562/thread/0fe61a4d/#8091):

hi.i want to put my cbfuns into my class.something like that:

class scene{

public:  
virtual void mouse\_callback(GLFWwindow\*, int, int, int);  
};

i tried a few case.But no lucky.i always get func signature error something like:

error: cannot convert ‘void (scene::_)(GLFWwindow_, int, int, int)’ to ‘GLFWmousebuttonfun {aka void (_)(GLFWwindow_, int, int, int)}’ for argument ‘2’ to ‘void (\* glfwSetMouseButtonCallback(GLFWwindow\*, GLFWmousebuttonfun))(GLFWwindow\*, int, int, int)’

So i wonder whether it is possible.if so how?

it might be better to add this signature to all cbfuns. for above e.g:

void mouse\_callback(GLFWwindow\*, int, int, int,void\* userdata);

i think @userdata signature above have many use case and many help to developer.

Doing so developer can share his data along cbfuns.  
i noticed wayland/weston use this approach for its cbfuns.

What about you? performance may be affected.

---

<div class="post-metadata">

**Author:** ![system](https://canada1.discourse-cdn.com/flex035/uploads/glfw/original/1X/b8cdefe6b61b8d5aee6c43b2c56e9cf5eabecfe4.svg) [@system](https://discourse.glfw.org/u/system)\
**Post date:** [March 13, 2014, 1:03pm UTC](https://discourse.glfw.org/t/is-it-possible-to-put-cbfuns-into-a-class/50/2 "2014-03-13T13:03:28Z")

</div>

**[dougbinks](https://sourceforge.net/u/dougbinks/)** wrote on [Thursday, March 13, 2014](https://sourceforge.net/p/glfw/discussion/247562/thread/0fe61a4d/#861a):

Pointers to C++ member functions can’t be used in this way (try searching C++ pointer to member function for more information).

A typical approach to get around this is a static function and data member, something like:

```auto
class scene{
public:
static scene m_Scene;
static void mouse_callback_static(GLFWwindow* window, int button, int action, int mods)
{
    m_Scene.mouse_callback(window,button,action,mods);
}
virtual void mouse_callback(GLFWwindow* window, int button, int action, int mods);
};

```

You can then use mouse\_callback\_static as the callback function. To have different scene instances for different windows would require some form of mapping between window and scene, for example using std::map or similar.

---

<div class="post-metadata">

**Author:** ![system](https://canada1.discourse-cdn.com/flex035/uploads/glfw/original/1X/b8cdefe6b61b8d5aee6c43b2c56e9cf5eabecfe4.svg) [@system](https://discourse.glfw.org/u/system)\
**Post date:** [March 13, 2014, 2:19pm UTC](https://discourse.glfw.org/t/is-it-possible-to-put-cbfuns-into-a-class/50/3 "2014-03-13T14:19:00Z")

</div>

**[q66680](https://sourceforge.net/u/q66680/)** wrote on [Thursday, March 13, 2014](https://sourceforge.net/p/glfw/discussion/247562/thread/0fe61a4d/#1d46):

it has helped that you said.Thank you.

EDIT:it’s ok that to put callback func into class by adding “static” keyword.

But i cannot virtualize it.Because of:

> <https://stackoverflow.com/questions/12163138/static-member-function-semantics-when-calling-virtual-functions>

is it reality?

---

<div class="post-metadata">

**Author:** ![system](https://canada1.discourse-cdn.com/flex035/uploads/glfw/original/1X/b8cdefe6b61b8d5aee6c43b2c56e9cf5eabecfe4.svg) [@system](https://discourse.glfw.org/u/system)\
**Post date:** [March 31, 2014, 8:32am UTC](https://discourse.glfw.org/t/is-it-possible-to-put-cbfuns-into-a-class/50/4 "2014-03-31T08:32:56Z")

</div>

**[dougbinks](https://sourceforge.net/u/dougbinks/)** wrote on [Monday, March 31, 2014](https://sourceforge.net/p/glfw/discussion/247562/thread/0fe61a4d/#cc09):

To use virtual members, you need to do this by setting a point to the base class with an instance of a derived class. You can do this as follows:

```auto
class scene{
public:
static scene* m_pScene;
static void mouse_callback_static(GLFWwindow* window, int button, int action, int mods)
{
    m_pScene->mouse_callback(window,button,action,mods);
}
virtual void mouse_callback(GLFWwindow* window, int button, int action, int mods);
};

class myDerivedscene : public scene
{
    myDerivedscene()
    {
        m_pScene = this;
    }
};

```
