Проблемы с указателем на функцию: прохождение и объявление - PullRequest
3 голосов
/ 26 июля 2011

Эй, я пытаюсь выяснить указатели на функции и как их обойти / объявить, но у меня возникли небольшие проблемы с передачей указателя в конструкторе моего класса Button и установкой его указателя на функцию-член тоже переданного указателя.

  • когда я пишу Button (Func1) Button1, он говорит, что ожидал ';'
  • когда я пишу Button (Func1); в нем нет конструктора по умолчанию для кнопки
  • когда я пишу кнопку (& Func1); он говорит, что Func1 требует инициализатора
  • когда я пишу Button (& Func1 ()) Button1; он говорит, что выражение должно быть lvalue или обозначение функции

Что я делаю не так?

void Func1(){std::cout << "This is a function\n";};
void Func2(){std::cout << "This is another function\n";};

class Button
{
private:
    void (*Func)(void);

public:
    void Activate(){ Func() ;};

    Button( void (*Function)(void)){
        this->Func = Function;};
};

Button(&Func1) Button1;
Button(&Func2) Button2;

Button1.Activate();
Button2.Activate();

Ответы [ 2 ]

4 голосов
/ 26 июля 2011

Этот код имеет неправильный синтаксис:

Button(&Func1) Button1;
Button(&Func2) Button2;

Должно быть:

Button Button1(&Func1);
Button Button2(&Func2);

И объявление указателя функции:

void (*Func)(void);

Оставить без параметров пустые:

void (*Func)();

Редактировать : Рабочий пример при ideone .

1 голос
/ 26 июля 2011

Думайте об этом как:

return_type (*ptr_name)(arguments);

Часто проще всего использовать typedef, чтобы держать его как можно ближе к этому.Например:

void *(*f)(int);

можно переписать как:

typedef void *ret_type;

ret_type (*f)(int);

, это становится особенно актуально, когда / если все становится сложным - например, в любое время, когда вы выполняете какое-то псевдо-функциональное программированиес одной функцией, возвращающей указатель на другую функцию, вы почти наверняка захотите использовать typedef, чтобы сохранить две прямые.

Редактировать: Вы также должны знать, что вы, кажется, пытаетесь заново изобрести Командушаблон.Возможно, вы захотите взглянуть (для одного примера) на реализацию шаблона команды в Modern C ++ Design .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...