2011-09-22 59 views
1

我正面臨一個我不明白的錯誤。我試圖創建和使用方法指針的靜態數組。在我班上的聲明如下所示:方法指針的靜態數組

static void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data); 

初始化發生在我的.cpp文件是這樣的:

void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data); 

這裏說到的煩惱,在我的客戶的類中的方法之一,我試着使用這個方法指針的數組。 我試過多種方法,例如:

(this->*packetHandler[_opcode])(data); 

我說我不明白的問題,讓我來解釋爲什麼。在我的代碼上運行make會導致正確的編譯,如果連接的話會出現問題。

client.cpp:71: undefined reference to `Client::packetHandler' 

該消息重複5次。

任何幫助將受到歡迎。 謝謝。

+0

靜態屬於您的翻譯單元。也許出口將是有序的。 –

+2

它會太令人討厭,告訴你使用boost :: function來代替嗎? –

+5

我會強烈建議一些typedefs來清除這個混亂。 –

回答

3

void (Client::*packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data);聲明瞭一個名爲packetHandler的全局變量。您想要定義您的類變量,需要額外的Client::,如下所示:

void (Client::*Client::packetHandler[Op::handledOpcodeMax - Op::handledOpcodeMin + 1])(QByteArray &data); 
+0

哈哈謝謝尼爾。在@thekashyap評論之後,我正在想這樣的事情。我嘗試了'void(Client :: Client :: * packetHandler [Op :: handledOpcodeMax-Op :: handledOpcodeMin + 1])(QByteArray &data);'。*'''D:Thanks :) :) – Xaqq

+0

Kerrek SB的評論abt typedefing有多重要.. :) – Kashyap

0

Client::*packetHandler是一個成員函數指針,指向一個名爲Client::packetHandler的成員函數。我不知道如何使一個成員函數指針指向一個任意的成員函數,這是你似乎想要做的。我認爲喬治是對的。您應該考慮使用類似boost::functionstd::tr1::function的東西或編寫您自己的成員函數包裝類。

+0

要使函數指針指向任何成員函數都是簡單的,特別要做的。我的問題在於,我希望這個數組成爲我的類的靜態元素。除去頭文件中的'static'關鍵字使編譯和鏈接工作。 – Xaqq