【问题标题】:C++ - How to access private members of a class, from a static function of the same class?C++ - 如何从同一个类的静态函数访问一个类的私有成员?
【发布时间】: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'
}

【问题讨论】:

  • 函数必须有一个类类型的参数。在这种情况下,您可以访问作为此参数的参数传递的对象的数据成员。
  • 静态成员函数中需要类实例才能访问非静态成员变量。

标签: c++ class static callback


【解决方案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;
        

        【讨论】:

          猜你喜欢
          • 2014-12-05
          • 2012-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多