【发布时间】:2014-03-10 15:08:50
【问题描述】:
我正在用 C++/CLR 设计一个使用用户代码提供的回调函数的类。
如果回调函数是免费的(即不是类的成员),这将非常有效。它与纯 C++ 中的几乎相同。
下面是一些运行良好的示例代码:
ref class ClassThatUsesCallback
{
public:
typedef void (*callback_t)( String^ );
void setCallback( callback_t pfun )
{
myCallback = pfun;
}
void Run()
{
if( myCallback != nullptr ) {
myCallback("This is a test");
}
}
private:
callback_t myCallback;
};
void FreeFunction( String^ s )
{
Console::WriteLine( "Free Function Callback " + s );
}
int main(array<System::String ^> ^args)
{
ClassThatUsesCallback^ theClassThatUsesCallback
= gcnew ClassThatUsesCallback();
theClassThatUsesCallback->setCallback( FreeFunction );
theClassThatUsesCallback->Run();
}
但是,我希望回调函数成为用户代码中某个类的成员(这样它就可以利用和更改用户代码类的属性)
以下代码无法编译
ref class ClassThatProvidesCallback
{
public:
void MemberFunction( String^ s )
{
Console::WriteLine( "Member Function Callback " + s );
}
void Run()
{
ClassThatUsesCallback^ theClassThatUsesCallback
= gcnew ClassThatUsesCallback();
theClassThatUsesCallback->setCallback(
&ClassThatProvidesCallback::MemberFunction );
theClassThatUsesCallback->Run();
}
};
我收到此错误
error C3374: can't take address of 'ClassThatProvidesCallback::MemberFunction'
unless creating delegate instance
当我研究这个时,我发现许多关于如何从托管代码调用非托管代码的解释(反之亦然)我不需要这样做 - 所有涉及的代码都是托管的。所以我希望有人能给我指出一个简单的方法。
【问题讨论】:
-
请改用 event 关键字。
-
当然,最好使用标准事件,它具有与回调相同的功能,并允许有多个订阅者。请参阅
EventHandler<TEventArgs>delegate。