2013-10-11 8 views
0

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

У меня есть доступ к экземпляру класса в моей статической функции, но я до сих пор не могу вызвать функцию члена через указатель б/с сообщения об ошибке 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; 
} 

Указатель базы хранится в 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); 
+1

«Не работает», недостаточно для продолжения. Будьте точны. –

+2

По определению невозможно получить доступ к элементу класса без экземпляра класса. Поэтому вашей статической функции нужен экземпляр. Тебе нужно работать над этим. Тот факт, что в вашем случае член класса является указателем на функцию-член, не имеет значения. – john

+1

Теперь вы сказали нам сообщение об ошибке, похоже, что вы пытаетесь получить доступ к члену класса из статической функции. Возможно ли, что 'vector' является членом? (В любом случае, пожалуйста, разместите достаточно кода, чтобы воспроизвести проблему, код, который вы опубликовали, отлично подходит для соответствующих определений 'object',' vector', 'a',' function' и 'parameter', поэтому проблема должна быть в определениях этих). –

ответ

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)) (параметр)'. – GILGAMESH

+1

@GilgameshOfUruk: Этот синтаксис работает для меня: http://ideone.com/78EoLL. Если вы все еще не можете заставить его работать, вы должны опубликовать достаточно кода, чтобы воспроизвести вашу проблему. В частности, было бы полезно определить тип в векторе и точный тип 'object',' function' и 'parameter'. –

+0

Хм, я упростил свой код и разместил его. – GILGAMESH

Смежные вопросы