如何解释这个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 }

如何解释这个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 },c++,class,oop,templates,C++,Class,Oop,Templates,据我所知,它创建了事件类的一个实例,并将其存储在EV\u ScriptThread\u Execute中。然后它定义了ScriptThread类,但我不知道如何解释后面的行 有人能解释一下发生了什么事吗?如果它是完整编写的,{&EV\u ScriptThread\u Execute,Execute},看起来会是什么样子,而不像它看起来是一个简写符号 编辑: 显然,我误解了我认为会产生的宏定义:classscriptthread:Listener,基于我返回的所有回复,我发现它实际上构造了某种数组

据我所知,它创建了事件类的一个实例,并将其存储在
EV\u ScriptThread\u Execute
中。然后它定义了ScriptThread类,但我不知道如何解释后面的行

有人能解释一下发生了什么事吗?如果它是完整编写的,{&EV\u ScriptThread\u Execute,Execute},看起来会是什么样子,而不像它看起来是一个简写符号

编辑: 显然,我误解了我认为会产生的宏定义:
classscriptthread:Listener
,基于我返回的所有回复,我发现它实际上构造了某种数组。它仍然让我对发生的事情一无所知。。。由于我实际上无法编译代码(因为它只是一个片段),因此我也无法真正查看预编译文件

结果如何

ResponseDef<ScriptThread> ScriptThread::Responses[] =
{
    { &EV_ScriptThread_Execute, Execute },
    { NULL, NULL}
};
ResponseDef ScriptThread::Responses[]=
{
{&EV_ScriptThread_Execute,Execute},
{NULL,NULL}
};
另一编辑: 所以我发现ResponseDef是一个结构,看起来像这样:

template< class Type >
struct ResponseDef
{
    Event *event;
    void (Type::*response)(Event *event);
};
模板
结构响应函数
{
事件*事件;
无效(类型::*响应)(事件*事件);
};
总之,这意味着数组将被一个结构填充,该结构既包含指向
事件
实例的指针,也包含指向方法的指针,这将解释初始值设定项


谢谢大家把我带回正轨

查找侦听器的宏定义。我很确定这背后隐藏着可怕的东西。没有其他方法可以将这个片段转换成C++编译器所接受的东西。 我预计会出现以下情况:

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

搜索最长的单个令牌,
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是谁,我不知道。我试图寻找宏定义,但找不到,所以我认为它可能是某种我不知道的C++技巧。我会尝试用你的例子来搜索。编译器通常有一个开关来产生预编译代码。你可以通过那个开关,看看输出来看看。这扩展到了什么。在我看来,它就像一个初始值设定项列表。你能展示一下Lister类的定义吗?但正如Sebastian所建议的,它也可以是一个宏。生成预处理的文件来获得这个想法。@Mahesh它在我看来也非常像一个初始值设定项列表。我对他的代码片段有点怀疑。它一开始就像一个类deFrEnter,但是C++语法中没有生成允许类定义的开头<代码> {< /代码>后面跟着第二个<代码>{。即使
Listener
是一个宏,它也必须完成类定义,并开始数据定义,这样才有可能合法。更新后的帖子中,我误解了最初的宏,但它仍然对发生的事情一无所知。与其说是宏本身,还不如说是如何定义
{&EV\u ScriptThread\u Execute,Execute},
适合一个数组…解决了它,多亏了大家!它确实来自一个“插入”“解决3地震为基础的游戏,但是,因为我认为这是一个C++语法技巧,我没有找到相关的链接到它来。”StAcExver确实需要接受一个以上的答案,但谢谢你!