C ++:具有指向函数作为属性的指针的类

时间:2012-10-07 19:59:26

标签: c++ function parameters function-pointers

我有一个Button类:

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 个答案:

答案 0 :(得分:2)

私有部分中的函数指针未按原样声明。

应该是:

void *(functionPtr)();

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

答案 1 :(得分:1)

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

void* function;

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

void (*function)();

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

答案 2 :(得分: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;
        }
    }
}

答案 3 :(得分:0)

您可以更改字段声明

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

或使用演员:

((void (*)())this->function)();