C ++ - 如何从同一个类的静态函数访问类的私有成员?

时间:2015-07-12 12:52:10

标签: c++ class static callback

我有什么:

所以我有一个私有成员和静态函数的类。 该功能必须是静态的,我无法改变它。

我想要的是什么:

我需要从静态函数访问私有成员。 有任何想法吗? :)

请检查以下代码:

class Base
{
private:
   int m_member;
public:
   Base() : m_member(0) {};
   ~Base() {};

   static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode); /* This must really be static because it is coming from C */
};

void Base::key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
    m_member = 1; // <---- illegal reference to non-static member 'Base::m_member'
}

4 个答案:

答案 0 :(得分:3)

静态成员函数是的一部分,并且没有与之关联的对象实例(换句话说,静态成员函数中没有this指针)。为了能够访问非静态成员变量,您需要一个实际的类实例。

使用旧C库设置回调时的一个常见解决方案是使用某种用户数据指针,并将其分配给类的实例。幸运的是,GLFW库have such a pointer that you can use

答案 1 :(得分:1)

你不能。您需要一个实例才能访问非静态私有。在静态方法中,您没有可用的实例。

因此,您需要一些方法来获取实例,方法是将其传递给静态方法,或者从其他地方获取实例。但在这种情况下,您也可以将其作为非静态方法。

答案 2 :(得分:1)

static成员函数无法访问非static成员(除非它创建非static成员所属的本地实例)。

这是因为非static成员属于class的实例,而static成员则不属于Base::callback(...); 成员。想一想:如果你写了

m_member

这次访问应该Base根本没有m_member的实例,因此没有{{1}}。

答案 3 :(得分:0)

你可以m_member

static int m_member;