gpt4 book ai didi

c++ - 未解析的外部符号,带有自制委托(delegate)

转载 作者:行者123 更新时间:2023-11-30 02:04:15 25 4
gpt4 key购买 nike

我有一个函数 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));

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

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# 传入的)

最佳答案

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

如果您必须支持调用不同的 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;
}

关于c++ - 未解析的外部符号,带有自制委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10879518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com