0

この頭のてっぺんの小さな男女共学のスニペットを参照してください。

typedef void __fastcall (__closure *GetHTTPCallBack)(String filename);

class Foo {

  private:

  public:
    GetHTTPCallBack Callback;

         __fastcall Foo         (void)                     { Callback = NULL;     }
         __fastcall Foo         (GetHTTPCallBack callback) { Callback = callback; }
};

class Bar {

  private:
    Foo *foo;

  public:
    void __fastcall CallbackFunction(String fileName) { // Do something  }
    void __fastcall SetByConstructor(void)            { foo = new Foo(CallbackFunction); }
    void __fastcall SetByAssignment (void)            { foo = new Foo(); foo->Callback = CallbackFunction; }
};

Bar bar;

今問題に。

Call bar.SetByAssignment()it が正常に動作する場合、関数ポインタが設定され、Foo から正しく呼び出されます。ただし、この場合はパブリック変数として公開されます。プライベートでお願いします。

コンストラクターで関数ポインターを渡すことにより、クラスを単純化し、プライベートに非表示にしたいのですbar.SetByConstructor()が、ここでコンパイラ エラーが発生します。

[bcc32 Error] : Member function must be called or its address taken

__closureこれが可能になると思いました。それはまったく可能ですか、それとも私が間違っているだけですか?

4

1 に答える 1

2

コンパイラの指示に従ってください。メソッドのメモリ アドレスを渡します。何かのメモリアドレスを取得するにはどうすればよいですか? &アドレス演算子を使用します。

foo = new Foo(&CallbackFunction); 

割り当てを使用する場合にも、これを行うのは良い習慣です (ただし、その場合はオプションです)。

foo->Callback = &CallbackFunction;
于 2014-10-04T07:01:40.697 に答える