1

私はGUIに取り組んでおり、ボタンに関数ポインタを渡すことができるようにしたいのですが、これらはさまざまな種類のクラスから呼び出される可能性があるため、テンプレートを使用しました。

関数ポインタを正しく保存していると思いますが、正しく呼び出すことができません。

class MainMenuScene: public Scene
{
    public:
        void add_button(){
            void (MainMenuScene::*func)();
            func = &MainMenuScene::test;
            Button b(func);
            b.click();
        }
        void test();
    private:
        GUI<MainMenuScene> gui;
};


template<class T>
class Button: public GUI_object{
public:
    Button(void (T::*func)());
    void click(){
        func_();
private:
    void (T::*func_)();
};

これは私が得るエラーです:

Button.h|23|error: must use '.*' or '->*' to call pointer-to-member function 
in '((Button<MainMenuScene>*)this)->Button<MainMenuScene>::func_ (...)', 
e.g. '(... ->* ((Button<MainMenuScene>*)this)->Button<MainMenuScene>::func_) (...)'|
4

2 に答える 2

3

ポインタを格納する関数は静的関数ではないため、呼び出すにはオブジェクト インスタンスが必要です。

このようなものかもしれません:

class MainMenuScene: public Scene
{
    public:
        void add_button(){
            void (MainMenuScene::*func)();
            func = &MainMenuScene::test;
            Button<MainMenuScene> b(this, func);
            b.click();
        }
        void test();
    private:
        GUI<MainMenuScene> gui;
};


template<class T>
class Button: public GUI_object{
public:
    Button(T* obj, void (T::*func)());
    void click(){
        (obj_->*func_)(); }
private:
    void (T::*func_)();
    T* obj_;
};
于 2013-11-06T14:01:31.240 に答える