3

我正在浏览我正在从事的个人项目的一段 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 },它是完整的,而不是看起来像一个速记符号,会是什么样子。

编辑:显然我误解了我认为会产生的宏定义: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一个指向方法的指针,这将解释初始化程序!

感谢大家让我重回正轨!

4

2 回答 2

4

寻找 Listener 的宏定义。我很确定这背后隐藏着一些可怕的东西。没有其他方法可以将此片段转换为 C++ 编译器可以接受的内容。

我期待类似的东西:

#define Listener ScriptBaseClass { void Execute(Event *ev); } the_script[] =
于 2013-09-27T14:17:40.090 回答
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 }   
};

从这里:.htm">http://read.pudn.com/downloads99/sourcecode/windows/bitmap/406853/doors.cpp_.htm

它显然是相关的代码,它来自什么?Quake 2. 所以这就是我们正在研究的——关于你的特定代码如何或为什么工作的任何更详细的信息,我们需要查看(或找到)更多......这可能有点棘手上述文件中列出的修订历史:

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

也许其他人知道 Markd 是谁;我不。

于 2013-09-27T14:24:06.790 回答