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++

C++哪里写一个类的函数? [关闭]

[C++][linux][原创]让类的成员变量可以在类的静态函数中访问

[C++][linux][原创]让类的成员变量可以在类的静态函数中访问

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

Friend函数访问静态库中定义的类的私有成员