1

ボタン クラスが独立している必要がある allegro ゲームを作成しているので、OnClick イベントのボタン オブジェクト内に関数ポインターを配置しています。プロジェクトを進めていくと、MyButton コンストラクターの引数にグローバル関数を入れていて、すべてが機能していました。そこに Node::OnClick() を渡そうとしたときに問題が発生しました。

Node.h:

class Node {
private:
    static int _id;
    int id;
    bool active;
    std::vector<Node*> neighbours;
    std::vector<bool> mask;
public:
    Node();
    int getId();
    void addNeighbour(Node* neighbour);
    void OnClick();
    void Check();
    void Uncheck();
    bool isActive();
};

MyButton.h:

class MyButton {
private:
    MyRectangle* boundingBox;
    ALLEGRO_BITMAP* image;
    void (*onClick)(void);
public:
    MyButton();
    MyButton(ALLEGRO_BITMAP* img, MyRectangle* boundingBox, void (*onClick)(void)); 
    MyButton(ALLEGRO_BITMAP* img, int x, int y, void (*onClick)(void)); 
    void Draw();
    void clickCheck(int x, int y);
};

主要:

Node* current = graph->getNode(i);
buttons[i] = new MyButton(scarab1, button_coords[0]-27, button_coords[1]-27, current->OnClick);

エラー:

error C3867: 'Node::OnClick': function call missing argument list; use '&Node::OnClick' to create a pointer to member

このコードは問題なく実行されます。

buttons[i] = new MyButton(scarab1, button_coords[0]-27, button_coords[1]-27, &testOnClick);

&Node::OnClick を次のように ctor 引数に入れたら:

buttons[i] = new MyButton(scarab1, button_coords[0]-27, button_coords[1]-27, &Node::OnClick);

それから私は得ています:

main.cpp(135): error C2664: 'MyButton::MyButton(ALLEGRO_BITMAP *,int,int,void (__cdecl *)(void))' : cannot convert parameter 4 from 'void (__thiscall Node::* )(void)' to 'void (__cdecl *)(void)'
4

1 に答える 1