函数指针typedef - expression必须是可修改的左值错误

时间:2016-08-16 20:08:32

标签: c++ function-pointers typedef member-function-pointers

我有一个函数指针的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;
        }

完全有效??? 我做错了什么?

由于

2 个答案:

答案 0 :(得分:3)

您需要使用正确的语法来获取指向成员函数的指针:

kFunc = &Controls::KeyLeftDown;

答案 1 :(得分:0)

除了@ Oktalist的答案之外,在尝试创建代码的可编译版本后,您的代码存在两个主要问题:

  1. 要获取成员函数指针,语法为&<ClassName>::<FunctionName>
  2.   

    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;
    
    1. 要调用此类函数,您需要将其绑定到对象:(this->*func)()
    2.   

      prog.cpp:51:10:错误:必须使用&#39;。&#39;或者&#39; - &gt; &#39;在&#39; func(...)&#39;中调用指向成员的函数,例如&#39;(... - &gt; * func)(...)&#39;

      func();
          ^