У меня есть функция Foo
, которая принимает в качестве параметра двухпараметрическую функцию:
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 #)
Delegate
- плохая идея в этой ситуации. Это дает вам иллюзию обертывания функции в экземпляре класса, тогда как на самом деле фактически вызываемая функция зависит от того, из чего был построен последний экземплярDelegate
, который должен быть построен.Delegate::_Callback
- это фактически глобальные данные. - person CB Bailey   schedule 04.06.2012