我有一个函数指针的typedef,我正在尝试创建一个函数指针并让它指向同一个类的成员函数:
typedef void(Controls::*KeyFunction)(void);
class Controls
{
public:
void OnKeyDown(Key key);
// Key Down Functions
void KeyLeftDown();
void KeyRightDown();
void KeyDownDown();
void KeyUpDown();
private:
static BOOL KeyEvent(LPARAM keyFunc, WPARAM null, UINT flags);
};
void Controls::OnKeyDown(Key key)
{
KeyFunction kFunc;
switch (key)
{
case Key::Left:
kFunc = KeyLeftDown;
break;
case Key::Right:
kFunc = KeyRightDown;
break;
case Key::Up:
kFunc = KeyUpDown;
break;
case Key::Down:
kFunc = KeyDownDown;
break;
default:
return;
}
SendKeyEvent(kFunc, DO_NOT_REMOVE);
}
BOOL Controls::KeyEvent(LPARAM keyFunc, WPARAM null, UINT flags)
{
KeyFunction func = (KeyFunction)(keyFunc);
func();
return TRUE;
}
使用typedef'KeyFunction'总是给出一个表达式错误,必须是一个可修改的左值。但是,如果我只使用defintion本身并跳过typedef它可以工作..例如:
void(Controls::*kFunc)(void);
switch (key)
{
case Key::Left:
kFunc = KeyLeftDown;
break;
}
完全有效??? 我做错了什么?
由于
答案 0 :(得分:3)
您需要使用正确的语法来获取指向成员函数的指针:
kFunc = &Controls::KeyLeftDown;
答案 1 :(得分:0)
除了@ Oktalist的答案之外,在尝试创建代码的可编译版本后,您的代码存在两个主要问题:
&<ClassName>::<FunctionName>
。prog.cpp:31:15:错误:无法转换&#39; Controls :: KeyLeftDown&#39;来自类型&#39; void(Controls ::)()&#39;键入&#39; KeyFunction {aka void(Controls :: *)()}&#39;
kFunc = KeyLeftDown;
prog.cpp:31:18:错误:ISO C ++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针。 Say&#39;&amp; Controls :: KeyLeftDown&#39; [-fpermissive]
kFunc = &KeyLeftDown;
(this->*func)()
prog.cpp:51:10:错误:必须使用&#39;。&#39;或者&#39; - &gt; &#39;在&#39; func(...)&#39;中调用指向成员的函数,例如&#39;(... - &gt; * func)(...)&#39;
func(); ^