2013-03-30 3 views
1

У меня проблемы с исправлением проблемы. У меня есть два класса. Один из них называется MenuBar, в этом классе есть векторный массив другого объекта (MenuOption). MenuBar содержит метод, который создает новый MenuOption и добавляет его в массив. Конструктору MenuOption нужны два аргумента: строка (для имени) и функция (действие, выполняемое этой опцией). Я хочу, чтобы полученная функция была такой формы:Функция с объектом в качестве аргумента, как аргумент другой функции

void method (SDL_Surface * arg1, MenuBar * arg2);

Поэтому я исправил проблему двойного включения, добавив «class MenuBar;» сразу после моего #include "MenuBar.h". Но у меня все еще есть ошибка, она говорит «ошибка: неверное использование выражения void» в строке I, помеченной в приведенном ниже коде main.cpp.

Теперь мой полный код выглядит следующим образом:

main.cpp

void connect(SDL_Surface* arg1, MenuBar* arg2); 
void about(SDL_Surface* arg1, MenuBar* arg2); 

int main() 
{ 
    SDL_Surface* screen; 
    MenuBar menu(/*initialization*/); 
    menu.addOption("Connect",connect(screen,&menu));//<--------- 
    menu.addOption("About",about(screen,&menu)); //<--------- 
} 

void connect(SDL_Surface* arg1, MenuBar* arg2) 
{...} 

void about(SDL_Surface* arg1, MenuBar* arg2) 
{...} 

MenuBar.h

#include "MenuOption.h" 
class MenuBar 
{ 
    public: 
     ... 
     void addOption(string optionName,void (*f)(SDL_Surface*, MenuBar*)); 
    private: 
     vector<MenuOption> optionList; 
} 

MenuBar.cpp

void MenuBar::addOption(string optionName,void (*f)(SDL_Surface*, MenuBar*)) 
{ 
    MenuOption tempOption(optionName,f); 
    optionList.push_back(tempOption); 
} 

MenuOption.h

#include "MenuBar.h" 
class MenuBar; 

class MenuOption 
{ 
    public: 
     MenuOption(string optionName,void (*f)(SDL_Surface*, MenuBar*)); 
     void (*run)(SDL_Surface*, MenuBar*); 
    private: 
     string name; 
} 

MenuOption.cpp

MenuOption::MenuOption(string optionName,void (*f)(SDL_Surface*, MenuBar*)) 
{ 
    name = optionName; 
    run = f; 
} 

Спасибо за помощь!

Philou231

ответ

1
menu.addOption("Connect",connect(screen,&menu)); 

можно передать результат connect, который void, в качестве второго параметра addOption. Попробуйте:

menu.addOption("Connect",connect); 

-

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

addOption(string optionName,void (*f)(SDL_Surface*, MenuBar*), SDL_Surface*, MenuBar*) 

И звоните f с указанными параметрами addOption. Затем вы вызываете addOption следующим образом:

menu.addOption("Connect",connect, screen, &menu); 
+0

Wow! Теперь это очень много, спасибо. Он работает отлично. Я запутался, потому что не помню, что у меня была эта функция запуска, и эта функция должна была получить параметры. – Philou231

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