1

コンソールメニュークラスのこの作業コードがあります:

目標は、ユーザーが選択したときに呼び出される関数のベクトルを持つことです。

関数の部分は機能していますが、関数の代わりにクラスメソッドを含めたいのですが、できません。

ヘッダ:

typedef int (*FunctionPointer)();

class Menu {
    string title;
    vector <string> items;
    vector <FunctionPointer> functions;
public:
    Menu(string title);
    void addMenuItem(string,FunctionPointer);
    int showMenu();
};

コード:

int Menu::showMenu() {
    //removed code to make it easier to read
    //working code to get option
    functions[option-1]();
    return 0;
}

main.cpp

int quit() {
    cout << "QUIT";
    return 0;
}
int main() {
    Menu mainMenu("Main Menu");
    Menu subMenu("Sub Menu");
    mainMenu.addMenuItem("Sub Menu", *subMenu.showMenu);
    mainMenu.addMenuItem("Quit", *quit);
    mainMenu.showMenu();
}

終了関数ポインタは完全に正常に動作しますが、Menu クラスの下の showMenu メソッドも動作させる方法を見つけることができないようです :\

どんな助けでも大歓迎です!

4

1 に答える 1

1

showMenutypedefはメンバー関数であるため、メンバー関数用の追加が必要になります。

class Menu;

typedef int (*FunctionPointer)();
typedef int (Menu::*MemberFunctionPointer)();
//           ^^^^^^

また、メンバー関数に追加のオーバーロードが必要になります。

void addMenuItem(string, FunctionPointer)       { }
void addMenuItem(string, MemberFunctionPointer) { }

さらに、メンバー関数のアドレスを渡す必要があります。

mainMenu.addMenuItem("Sub Menu", &Menu::showMenu);
//                               ^^^^^^^^^^^^^^^
于 2013-10-14T23:10:42.150 に答える