我正在浏览一个我正在处理的个人项目的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
实例的指针以及指向方法的指针,这将解释初始化程序!
感谢大家让我重回正轨!
答案 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是谁;我没有。