2013-10-14 67 views
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方法也可以工作:\

任何幫助將不勝感激!

+0

成員函數指針ar e與(免費)函數指針不兼容。 '&Menu :: showMenu'類型爲'void(Menu :: *)()'。這個'* subMenu.showMenu'很可能是格式不正確的,'* quit'應該是'&quit'或者'quit'。 – dyp

+2

直接解決這個問題的方法是用'std :: function '替換函數指針並使用'bind(&Menu :: showMenu,subMenu)'(或者通過'std :: ref(subMenu) ')創建一個兼容的函數對象。但我寧願重新考慮設計。 – dyp

回答

1

showMenu是一個成員函數,所以你需要一個額外的typedef一個成員函數:

class Menu; 

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

而且,你要在成員函數的額外超負荷:

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

此外,您需要傳遞成員函數的地址:

mainMenu.addMenuItem("Sub Menu", &Menu::showMenu); 
//        ^^^^^^^^^^^^^^^ 
+0

我將如何製作一個接受這兩個typedef的向量? 另外我怎樣才能運行該成員函數?我一直在使用函數[x]運行自由函數,函數是一個函數指針向量。 –

+0

@RuiGomes你不能做一個接受'typedefs'的函數。通過調用''''類型的對象來運行成員函數。例如:'菜單m; (米。* mem_fun)()' – 0x499602D2