2011-07-25 13 views
3

嘿我想弄清楚函數指針和如何傳遞它們/聲明它們,但我有點麻煩傳遞一個指針在我的Button類的構造函數,並設置它的成員函數指針也是傳遞的指針。功能指針問題:傳遞和聲明

  • 當我寫按鈕(Func1)Button1它說預計';'
  • 當我寫按鈕(Func1);它說沒有默認的構造函數按鈕
  • 當我寫按鈕(& Func1);它說Func1需要一個初始化程序
  • 當我寫按鈕(& Func1())Button1;它說表達式必須是左值或函數標識符

我在做什麼錯?

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);也應該合法,因爲without()函數的名稱實際上是該函數的起始地址。 – Giorgio

+0

是的,這也是合法的。但是&不會導致任何事情。 – kravemir

+0

**** facepalm ****我需要更多的睡眠....雖然謝謝! – Griffin

1

它這樣想:

return_type (*ptr_name)(arguments); 

通常最容易使用的類型定義,以保持它作爲接近越好,太。例如:

void *(*f)(int); 

可以改寫爲:

當/如果事情變得複雜
typedef void *ret_type; 

ret_type (*f)(int); 

這一點變得尤其有關 - 例如,任何時候你做一些僞函數式編程,一個功能返回一個指向另一個函數的指針,你幾乎肯定希望使用typedef來保持兩個直線。

編輯:你也應該知道你似乎試圖重新發明命令模式。你可能想看(在一個例子中)Modern C++ Design的命令模式的實現。

+0

void * ret_type; - 錯了,它是變量的聲明而不是typedef! – kravemir

+0

@Miro:嗯......你的意思是'typedef'實際上應該說'typedef'?多麼奇怪的想法! :-)認真,謝謝 - 更正。 –