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;

现在来解决问题。

如果调用bar.SetByAssignment()它工作正常,则函数指针已设置并从 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 回答