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 (*functionPtr)();

詳細については、この質問をご覧ください。

于 2012-10-07T20:04:10.850 に答える
2

クラス変数宣言では、

void* function;

functionこれは、 へのポインタであるという名前の変数を宣言しますvoid。関数ポインターとして宣言するには、パラメーター リストと同じ構文が必要です。

void (*function)();

これは、 を返す関数へのポインタになりましたvoid

于 2012-10-07T20:02:03.797 に答える
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 に答える