我有什么:
所以我有一个私有成员和静态函数的类。 该功能必须是静态的,我无法改变它。
我想要的是什么:
我需要从静态函数访问私有成员。 有任何想法吗? :)
请检查以下代码:
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'
}
答案 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;