1

我有一个Foo以 2 参数函数作为参数的函数:

void Foo(void (*fcn)(int, int*));

但是,我要传入 ( func) 的函数类型只需要 1 个参数*

typedef void (__stdcall *FuncCallBack)(int a);

void Caller(FuncCallBack func) {
   Foo(????);
}

在 C# 中,我会执行以下操作:

Foo((a,b) -> func(a));

我正在尝试对委托类做类似的事情(发现我不能有一个指向绑定成员函数的指针,我已经切换到静态):

class Delegate {
private:
 static FuncCallBack _Callback;
public
 Delegate(FuncCallBack);
 static void Callback(int, int*);
}

Delegate::Delegate(FuncCallback callback) { _Callback = callback; }

void Delegate::Callback(int a, int *b) { _Callback(a); }

我这样使用:

void Caller(FuncCallBack func) {
   Delegate d = Delegate(func);
   Foo(&(d.Callback));
}

这目前给了我一个链接器错误:unresolved external symbol "private: static void (__stdcall* Delegate::_Callback)(int)" (?_Callback@Delegate@@0P6GXHHPAN0@ZA)

  • 问题 1:什么可能导致此链接器错误?
  • 问题2:有没有更好的方法来做到这一点?

*函数 typedef 包括__stdcall因为它是从(并将回调)C# 传入的)

4

2 回答 2

2

您需要只定义static一次类的成员(例如在 Delegate.cpp 中):

FuncCallBack Delegate::_Callback;

在发布的代码中只有一个_Callback.

于 2012-06-04T10:04:58.713 回答
2

正如我在评论中指出的那样,使用一个类看起来好像你已经将回调函数包装在一个类实例中,但由于回调函数是一个原始函数指针,它无法从它所在的类实例中访问任何状态从...获取。它只能访问静态成员变量,这意味着每当构造新实例时所有实例的行为。 DelegateDelegate

如果您必须支持调用不同的方法func,我会使用一个更简单的接口,这使得只有回调函数在某个时间处于活动状态这一事实从接口中更加明显。

例如:

callbackwrapper.h

void CallbackWrapper(int, int*);
void SetWrappedCallback(void (__stdcall *toWrap)(int));

callbackwrapper.cpp

namespace {
    void (__stdcall *wrappedCallback)(int);
}

void CallbackWrapper(int a, int*)
{
    wrappedCallback(a);
}

void SetWrappedCallback(void (__stdcall *toWrap)(int))
{
    wrappedCallback = toWrap;
}
于 2012-06-04T10:41:18.843 回答