C++ - 如何从同一个类的静态函数访问一个类的私有成员?
Posted
技术标签:
【中文标题】C++ - 如何从同一个类的静态函数访问一个类的私有成员?【英文标题】:C++ - How to access private members of a class, from a static function of the same class? 【发布时间】:2015-07-12 12:52:09 【问题描述】:我有什么:
所以我有一个带有私有成员和静态函数的类。 该函数必须是静态的,我无法更改。
我想要什么:
我需要从静态函数访问私有成员。 有任何想法吗? :)
请查看以下代码:
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'
【问题讨论】:
函数必须有一个类类型的参数。在这种情况下,您可以访问作为此参数的参数传递的对象的数据成员。 静态成员函数中需要类实例才能访问非静态成员变量。 【参考方案1】:静态成员函数是类的一部分,并且没有与之关联的对象实例(换句话说,静态成员函数中没有this
指针)。为了能够访问非静态成员变量,您需要该类的实际实例。
使用旧的 C 库设置回调时,一个常见的解决方案是使用某种用户数据指针,并将其分配给类的实例。幸运的是,GLFW 库 have such a pointer that you can use。
【讨论】:
【参考方案2】:static
成员函数无法访问非static
成员(除非它创建自己的本地实例,非static
成员将属于)。
这是因为非static
成员属于class
的实例,而static
成员不属于。想一想:如果你写了
Base::callback(...);
m_member
应该访问什么?根本没有Base
的实例,因此也没有m_member
。
【讨论】:
【参考方案3】:你不能。您需要一个实例才能访问非静态私有。在静态方法中,您没有可用的实例。
因此,您需要某种方法来获取实例,要么将其传递给静态方法,要么能够从其他地方获取它。但在这种情况下,您也可以将其设为非静态方法。
【讨论】:
【参考方案4】:你可以发m_member
static int m_member;
【讨论】:
以上是关于C++ - 如何从同一个类的静态函数访问一个类的私有成员?的主要内容,如果未能解决你的问题,请参考以下文章
[C++][linux][原创]让类的成员变量可以在类的静态函数中访问
[C++][linux][原创]让类的成员变量可以在类的静态函数中访问