簡體   English   中英

未解決的外部符號,帶有自制代表

[英]Unresolved external symbol, with home-made delegate

我有一個函數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#傳入的

您需要定義類的static成員一次(例如在Delegate.cpp中):

FuncCallBack Delegate::_Callback;

在發布的代碼中只有_Callback的聲明。

正如我在評論中指出的那樣,使用類使得看起來你已經將回調函數包裝在類實例中,但由於回調函數是一個原始函數指針,它無法從類實例訪問任何狀態從...獲取。 它只能訪問靜態成員變量,這意味着每當構造新的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM