Вызов указателя на функцию-член в статической функции

0

Название довольно наглядное. Я сохранил нестатический указатель на функцию-член в векторе структуры, в которой хранятся указатели на функции-члены в моем классе, и мне нужна статическая функция в классе для вызова этой функции.

У меня есть доступ к экземпляру класса в моей статической функции, но я все еще не могу назвать функцию-член через указатель 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);
Теги:
class
pointers
function
static

1 ответ

3
Лучший ответ

Я попробовал синтаксис (object)->*(function) (parameter)

Попробуйте вместо синтаксиса (object->*function)(parameter) если object является указателем, или (object.*function)(parameter) если это объект или ссылка.

UPDATE: теперь вы отправили сообщение об ошибке и некоторый репрезентативный код, мы видим, что проблема в том, что вы пытаетесь получить доступ к элементу класса func_rel из статической функции-члена. Вам нужно получить доступ к этому указателю класса:

(user_data->*(user_data->func_rel[a].function)) (window, wparam, lparam);
              ^^^^^^^^^^^
  • 0
    Хм, это не похоже на работу. Возможно, потому что мой указатель хранится в векторе структур, которые содержат указатели (object->*(vector[a].function)) (parameter) .
  • 1
    @GilgameshOfUruk: этот синтаксис работает для меня: ideone.com/78EoLL . Если вы все еще не можете заставить его работать, вы должны опубликовать достаточно кода, чтобы воспроизвести вашу проблему. В частности, было бы полезно определить тип в векторе и точный тип object , function и parameter .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню