如何理解我在源代码中找到的这个C ++类声明?

时间:2013-09-27 14:13:05

标签: c++ class oop templates

我正在浏览一个我正在处理的个人项目的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实例的指针以及指向方法的指针,这将解释初始化程序!

感谢大家让我重回正轨!

2 个答案:

答案 0 :(得分:4)

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

我期待的是:

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

答案 1 :(得分: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“&gt; 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是谁;我没有。