2013-09-27 30 views
3

我經歷了一塊C++源代碼的一個個人項目我的工作,我能不爲世人弄清楚發生了什麼下面的代碼片段:如何解釋我在源代碼中找到的這個C++類聲明?

Event EV_ScriptThread_Execute(
    "execute", EV_DEFAULT, NULL, NULL, "Execute the thread." 
); 

class ScriptThread : Listener 
{ 
    { &EV_ScriptThread_Execute, Execute }, 
    { NULL, NULL} 
}; 

void ScriptThread::Execute(Event *ev)  
{ 
    //Stuff 
} 

至於我可以解釋,它創建Event-class的一個實例並將其存儲在EV_ScriptThread_Execute中。然後它定義了ScriptThread類,但我不知道如何解釋它後面的行。

有人能解釋我會發生什麼嗎? { &EV_ScriptThread_Execute, Execute },如果完全寫入,看起來會如何,而不是看起來像是一個簡短的符號。

編輯: Apparantly我misintepreted宏定義,我認爲會產生:class ScriptThread : Listener,基於所有我回去,並發現它實際上是構建某種類型的數組的答覆。它仍然會讓我在黑暗中發生什麼...因爲我實際上無法編譯代碼(因爲它只是一個片段),所以我也無法真正查看預編譯的文件。

這是什麼結果?

ResponseDef<ScriptThread> ScriptThread::Responses[] = 
{ 
    { &EV_ScriptThread_Execute, Execute }, 
    { NULL, NULL} 
}; 

另一個編輯: 因此,我發現ResponseDef是一個結構,其看起來像這樣:

template< class Type > 
struct ResponseDef 
{ 
    Event *event; 
    void (Type::*response)(Event *event); 
}; 

決定性地,這意味着該陣列獲取與這需要雙方的指針的實例的結構填充Event以及一個指向方法的指針,它可以解釋初始化器!

感謝大家讓我回到正軌!

+0

在我看來,像一個初始化列表。你能展示Lister類的定義嗎?但正如塞巴斯蒂安所說,它也可以是一個宏觀的。生成預處理文件以獲得想法。 – Mahesh

+0

@Mahesh它看起來也像我的初始化列表一樣令人難以置信。 我對他的片段有點懷疑。它開始像 一個類的定義,但是在C++ 語法中沒有產生,這將允許類定義 的開頭「{」後跟第二個「{」。即使'Listener'是一個宏,它將不得不完成類定義,並開始一個數據定義,因爲這有可能是合法的。 –

+0

更新後,我誤解了最初的宏,但它仍然在黑暗中發生什麼事情。不是宏本身,而是'{&EV_ScriptThread_Execute,Execute},如何適合數組......「 –

回答

4

查找Listener的宏定義。我很確定這件事背後隱藏着可怕的東西。沒有其他方法可以將此片段轉換爲C++編譯器將接受的內容。

我希望是這樣的:

#define Listener ScriptBaseClass { void Execute(Event *ev); } the_script[] = 
+0

我試圖尋找一個宏定義,但找不到一個,所以我認爲它可能是某種我不知道的C++技巧。我將嘗試使用您的示例再次搜索。 –

+2

編譯器通常有一個開關來生成預編譯的代碼。您可以通過該開關並查看輸出以查看擴展到的內容。 –

2

搜索最長的單個標記,EV_ScriptThread_Execute,變成了這樣:

Event EV_ScriptDoor_DoInit("doinit"); 
Event EV_ScriptDoor_SetOpenThread("openthread"); 
Event EV_ScriptDoor_SetCloseThread("closethread"); 

ResponseDef ScriptDoor::Responses[] = 
{ 
    { &EV_ScriptDoor_DoInit,   (Response)ScriptDoor::DoInit }, 
    { &EV_Door_DoClose,     (Response)ScriptDoor::DoClose }, 
    { &EV_Door_DoOpen,     (Response)ScriptDoor::DoOpen }, 
    { &EV_ScriptDoor_SetOpenThread,   (Response)ScriptDoor::SetOpenThread }, 
    { &EV_ScriptDoor_SetCloseThread,   (Response)ScriptDoor::SetCloseThread }, 
    { NULL, NULL } 
}; 

從這裏:熱媒「> HTTP://read.pudn .com/downloads 99/sourcecode/windows/bitmap/406853/doors.cpp_.htm

這是明確相關的代碼,它來自什麼?Quake 2.所以這就是我們正在看的 - 更多的東西etailed有關如何以及爲什麼你的代碼的特定位的工作,我們需要看到(或找到)更多...那可能有點棘手。在上述文件中列出的修訂歷史:

// 48 8/24/98 11:32a Markd 
// Added Start method to threads, repladed all ProcessEvent( 
// EV_ScriptThread_execute) with thread->Start(-1) 

也許別人知道Markd是誰;我不。

+0

這確實來自基於Quake 3的遊戲的「插入式」解決方案,但是,因爲我認爲這是一種C++語法技巧,我沒有發現它與鏈接到它的來源相關。 –

+0

嗯,這不是C++語法,它是某種類型的Quake技巧。 –

+0

StackOverflow真的需要接受多個答案的可能性,但也要謝謝! –