2013-10-14 4 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(); 
} 

отказа от курения указатель функции отлично работает, но я не могу найти способ чтобы сделать метод showMenu в классе меню тоже: \

Любая помощь будет принята с благодарностью!

+0

Элемент функции указатели ar e несовместим с (свободными) указателями на функции. '& Menu :: showMenu' имеет тип' void (Меню :: *)() '. Этот '* subMenu.showMenu', скорее всего, плохо сформирован, и' * quit', вероятно, должен быть '& quit' или просто' quit'. – dyp

+2

Прямым решением этой проблемы было бы заменить указатели на функции 'std :: function ' и использовать 'bind (& Menu :: showMenu, subMenu)' (или по-ref с помощью '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

Как сделать вектор, который принимает оба типа typedefs? Также как я могу запустить эту функцию-член? Я выполнял свободные функции исключительно с помощью функций [x], являясь функциями вектора указателей функций. –

+0

@RuiGomes Вы не можете сделать функцию, которая принимает оба типа typedefs. Вы запускаете функцию-член, вызывая ее через объект типа 'Menu'. Например: «Меню m; (М. * Mem_fun)() ' – 0x499602D2

Смежные вопросы