如何解释这个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确实需要接受一个以上的答案,但谢谢你!