Название довольно наглядное. Я сохранил нестатический указатель на функцию-член в векторе структуры, в которой хранятся указатели на функции-члены в моем классе, и мне нужна статическая функция в классе для вызова этой функции.
У меня есть доступ к экземпляру класса в моей статической функции, но я все еще не могу назвать функцию-член через указатель b/c ошибки сообщения error C2597: illegal reference to non-static member
Синтаксис, который у меня есть сейчас (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 хранится в USERDATA окна, переданного функции WndProc
, и, следовательно, у меня есть доступ к экземпляру класса. В 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);
Я попробовал синтаксис
(object)->*(function) (parameter)
Попробуйте вместо синтаксиса (object->*function)(parameter)
если object
является указателем, или (object.*function)(parameter)
если это объект или ссылка.
UPDATE: теперь вы отправили сообщение об ошибке и некоторый репрезентативный код, мы видим, что проблема в том, что вы пытаетесь получить доступ к элементу класса func_rel
из статической функции-члена. Вам нужно получить доступ к этому указателю класса:
(user_data->*(user_data->func_rel[a].function)) (window, wparam, lparam);
^^^^^^^^^^^
(object->*(vector[a].function)) (parameter)
.object
,function
иparameter
.