请参阅这个小小的我头脑的男女同校代码:
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
会使这成为可能。是否可能,或者我只是做错了?
答案 0 :(得分:2)
执行编译器告诉您的操作。传递方法的内存地址。你如何获得任何的内存地址?使用&
地址运算符:
foo = new Foo(&CallbackFunction);
在使用作业时这样做是很好的习惯(尽管在这种情况下它是可选的):
foo->Callback = &CallbackFunction;