2011-07-25 18 views
3

ちょっと私は関数ポインタとそれらを渡して/それらを宣言する方法を把握しようとしているが、私の少しの問題を持っている私のButtonクラスのコンストラクタにポインタを渡し、関数ポインタも渡されたポインタ。関数ポインタの問題:渡して宣言する

  • 私がButton(Func1)Button1を書き込むと、 ';'と表示されます。
  • 私がButton(Func1)を書くとき;ボタンのデフォルトのコンストラクタはありません。
  • Button(& Func1); Func1はイニシャライザが必要です。
  • Button(& 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); 

がLeave:

void (*Func)(); 

編集ideoneで働い例。それの

+0

ボタンButton1(Func1); ()のない関数の名前は実際にその関数の開始アドレスであるため、合法でなければなりません。 – Giorgio

+0

はい、それも法的です。しかし、何も起こらない。 – kravemir

+0

**** facepalm ****私はもっと寝る必要があります....ありがとう! – Griffin

1

だと思うが好き:

return_type (*ptr_name)(arguments); 

それは多くの場合、あまりにも、可能な限りそれに近いそれを維持するためのtypedefを使用するのが最も簡単です。例えば: - たとえば、いつでもあなたには、いくつかの擬似関数型プログラミングを行う一つの機能で、とき/物事が複雑に得れば

typedef void *ret_type; 

ret_type (*f)(int); 

これは特に関連次のようになります。

void *(*f)(int); 

はのように書き換えることができます別の関数へのポインタを返すと、typedefを使って2つのストレートを保つことがほぼ確実になります。

編集:コマンドパターンを再作成しようとしているように見えることにも注意してください。コマンドパターンの実装を(一例として)Modern C++ Designで調べるとよいでしょう。

+0

void * ret_type; - 間違って、それはtypedefではない変数の宣言です! – kravemir

+0

@Miro:Hmmm ... 'typedef'は実際に' typedef'と言うべきですか?どのような奇妙なアイデア! :-)真剣に、感謝 - 訂正しました。 –