【问题标题】:Calling a Member Function Pointer in Static Function在静态函数中调用成员函数指针
【发布时间】:2013-10-19 15:27:39
【问题描述】:

标题非常具有描述性。我在一个结构的向量中存储了一个指向成员函数的非静态指针,该结构在我的类中存储了成员函数指针,我需要类中的一个静态函数来调用该函数。

我可以访问我的静态函数中的类实例,但我似乎仍然无法通过错误消息error C2597: illegal reference to non-static member的指针 b/c 调用成员函数

我现在的语法是(object->*(vector[a].function)) (parameter)。简化代码如下:

class Base
{
    private:
        struct FunctionRelation
        {
            UINT message;
            LRESULT (Base::*function) (HWND, WPARAM, LPARAM);
        };

        static LRESULT CALLBACK WndProc (HWND window, UINT msg, WPARAM wparam, LPARAM lparam);

        std::vector<FunctionRelation>   func_rel;
}

指向 Base 的指针存储在传递给WndProc 函数的窗口的 USERDATA 中,因此我可以访问类实例。在WndProc 我有:

Base *user_data = reinterpret_cast<Base *>(GetWindowLongPtr (window, GWLP_USERDATA));

//Loop through our function relations and call those functions. Else, just return DefWindowProc.
if (user_data != NULL) //If it is not directly after we created a window.
    for (int a = 0;a < static_cast<int>(user_data->func_rel.size ());a++)
        if (user_data->func_rel[a].message == msg)
            return (user_data->*(func_rel[a].function)) (window, wparam, lparam);

return DefWindowProc (window, msg, wparam, lparam);

【问题讨论】:

  • “不起作用”不足以继续下去。准确。
  • 根据定义,没有类实例就不可能访问类成员。因此,您的静态函数需要一个实例。你需要为此努力。在您的情况下,类成员是指向成员函数的指针这一事实无关紧要。
  • 现在您已经告诉我们错误消息,看起来您正在尝试从静态函数访问类成员。 vector 有可能是会员吗? (无论如何,请发布足够的代码来重现问题;您发布的代码很好,因为objectvectorafunctionparameter 的适当定义,所以问题必须在那些的定义中)。
  • 你不能这样访问私有成员。
  • 这很奇怪,虽然func_rel 是私有的,但我似乎没有遇到问题访问user_data-&gt;func_rel.size ()

标签: c++ function class pointers static


【解决方案1】:

我已经尝试过(object)-&gt;*(function) (parameter) 语法

如果object 是指针,请尝试使用(object-&gt;*function)(parameter) 语法,如果是对象或引用,请尝试(object.*function)(parameter)

更新:现在您已经发布了错误消息和一些代表性代码,我们可以看到问题在于您正试图从静态成员函数访问类成员 func_rel。您需要通过类指针访问它:

(user_data->*(user_data->func_rel[a].function)) (window, wparam, lparam);
              ^^^^^^^^^^^

【讨论】:

  • 嗯,这似乎不起作用。也许是因为我的指针恰好存储在包含指针(object-&gt;*(vector[a].function)) (parameter) 的结构向量中。
  • @GilgameshOfUruk:这种语法对我有用:ideone.com/78EoLL。如果你仍然不能让它工作,你应该发布足够的代码来重现你的问题。特别是,向量中类型的定义,以及objectfunctionparameter 的确切类型将很有用。
  • @GilgameshOfUruk:好的,现在你已经向我们展示了一些有代表性的代码,我可以看到问题所在。我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多