2011-07-25 4 views
3

Привет, я пытаюсь найти указатели на функции и как их передавать/объявлять, но у меня есть небольшая проблема с передачей указателя в моем конструкторе класса 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(); 

ответ

4

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

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

Оно должно быть:

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

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

void (*Func)(void); 

Отпуска без пустоты в параметрах:

void (*Func)(); 

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

+0

Button Button1 (Func1); также должно быть законным, поскольку имя функции без() на самом деле является начальным адресом этой функции. – Giorgio

+0

Да, это тоже законно. Но & ничего не вызывает. – kravemir

+0

**** facepalm **** Мне нужно больше спать .... Спасибо, хотя! – Griffin

1

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

return_type (*ptr_name)(arguments); 

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

void *(*f)(int); 

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

typedef void *ret_type; 

ret_type (*f)(int); 

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

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

+0

void * ret_type; - неправильно, это объявление переменной не typedef !! – kravemir

+0

@Miro: Хммм ... вы имеете в виду, что 'typedef' должен на самом деле сказать' typedef'? Какая странная идея! :-) серьезно, спасибо - исправлено. –

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