2

我有一个按钮类:

class Button : public Component {

private:
    SDL_Rect box;
    void* function;

public:
    Button( int x, int y, int w, int h, void (*function)() );
    ~Button();
    void handleEvents(SDL_Event event);

};

我想Button::function在方法中执行Button::handleEvents

void Button::handleEvents(SDL_Event event) {
    int x = 0, y = 0;
    // If user clicked mouse
    if( event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
            // Get mouse offsets
            x = event.button.x;
            y = event.button.y;

            // If mouse inside button
            if( ( x > box.x ) && ( x < box.x + box.w ) && ( y > box.y ) && ( y < box.y + box.h ) )
            {
                this->function();
                return;
            }
    }

}

当我尝试编译时,出现以下错误:

Button.cpp: In the constructor ‘Button::Button(int, int, int, int, void (*)(), std::string)’:
Button.cpp:17:18: error: invalid conversion from ‘void (*)()’ to ‘void*’ [-fpermissive]
Button.cpp: In the function ‘virtual void Button::handleEvents(SDL_Event)’:
Button.cpp:45:19: error: can't use ‘((Button*)this)->Button::function’ as a function
4

4 回答 4

2

在您的类变量声明中,您有

void* function;

这声明了一个名为的变量function,它是一个指向void. 要将其声明为函数指针,您需要与参数列表中的语法相同:

void (*function)();

这现在是一个指向返回函数的指针void

于 2012-10-07T20:02:03.797 回答
2

您的私有部分中的函数指针未按应有的方式声明。

它应该是 :

void (*functionPtr)();

查看这个问题以获取更多信息。

于 2012-10-07T20:04:10.850 回答
1

我建议std::function<void()>这种目的:

#include <functional>

class Button : public Component
{
private:
    SDL_Rect box;
    std::function<void()> function;

public:
    Button( int x, int y, int w, int h, std::function<void()> f);
    ~Button();
    void handleEvents(SDL_Event event);
};

void Button::handleEvents(SDL_Event event)
{
    int x = 0, y = 0;
    // If user clicked mouse
    if( event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT)
    {
        // Get mouse offsets
        x = event.button.x;
        y = event.button.y;
        // If mouse inside button
        if( ( x > box.x ) && ( x < box.x + box.w ) && ( y > box.y ) && ( y < box.y + box.h ) )
        {
            function();
            return;
        }
    }
}
于 2012-10-07T20:22:53.330 回答
0

您可能会更改字段声明,

void * function; // a void ptr
void (*function)(); // a ptr to function with signature `void ()`

或使用演员表:

((void (*)())this->function)();
于 2012-10-07T20:04:08.927 回答