2015-07-12 60 views
0

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

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

我想要什么:

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

请波纹管检查代码:

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' 
} 
+3

功能必须具有类类型的参数。在这种情况下,您可以访问作为参数参数传递的对象的数据成员。 –

+2

您需要静态成员函数中的类实例来访问非静态成员变量。 – Niall

回答

2

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

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

+0

很棒@Joachim !!!!谢谢!!!! – waas1919

1

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

因此,您需要某种方式来获取实例,或者将其传递给静态方法,或者通过从其他位置获取实例。但是在这种情况下,你可以使它成为一种非静态的方法。

1

A static成员函数不能访问非static成员(除非它创建了非static成员应属于的自己的本地实例)。

这是因为非static成员属于class的实例,并且static成员不属于。想想吧:如果你写了

Base::callback(...); 

什么m_member应该这个访问?根本没有Base的实例,因此不是m_member

0

你可以做m_member

static int m_member; 
相关问题