【问题标题】:How interpret this C++ class declaration I found in a source?如何解释我在源代码中找到的这个 C++ 类声明?
【发布时间】:2013-10-03 21:07:33
【问题描述】:

我正在查看我正在从事的个人项目的一段 C++ 源代码,但我无法弄清楚以下 sn-p 中发生了什么:

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
}

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

有人能解释一下会发生什么吗?如果{ &EV_ScriptThread_Execute, Execute }, 是完整的,而不是看起来是简写的符号,它会是什么样子。

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

这样做的结果是什么?

ResponseDef<ScriptThread> ScriptThread::Responses[] =
{
    { &EV_ScriptThread_Execute, Execute },
    { NULL, NULL}
};

另一个编辑: 所以我发现 ResponseDef 是一个看起来像这样的结构:

template< class Type >
struct ResponseDef
{
    Event *event;
    void (Type::*response)(Event *event);
};

最终,这意味着数组被一个结构填满,该结构接受一个指向 Event 实例的指针以及一个指向方法的指针,这将解释初始化程序!

感谢大家让我重回正轨!

【问题讨论】:

  • 在我看来就像一个初始化列表。你能展示 Lister 类的定义吗?但正如 Sebastian 所建议的,它也可以是一个宏。生成预处理文件以获得想法。
  • @Mahesh 在我看来,它也非常像一个初始化列表。我对他的sn-p有点怀疑。它一开始就像一个类定义,但在 C++ 语法中没有产生式允许类定义的开头{ 后面跟着第二个{。即使Listener 是一个宏,它也必须完成类定义并开始数据定义,这样才有可能合法。
  • 更新了帖子,我误解了最初的宏,但它仍然对发生的事情一无所知。与其说是宏本身,不如说是{ &amp;EV_ScriptThread_Execute, Execute }, 如何适合数组...
  • 解决了,谢谢大家!

标签: c++ class oop templates


【解决方案1】:

查找 Listener 的宏定义。我很确定这背后隐藏着什么可怕的东西。没有其他方法可以将这个 sn-p 转换为 C++ 编译器可以接受的东西。

我希望是这样的:

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

【讨论】:

  • 我尝试查找宏定义,但找不到,所以我认为这可能是某种我不知道的 C++ 技巧。我将尝试使用您的示例再次搜索。
  • 编译器通常有一个开关来生成预编译代码。您可以传递该开关并查看输出以查看扩展为什么。
【解决方案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 是谁;我没有。

【讨论】:

  • 它确实来自基于 Quake 3 的游戏的“插入式”解决方案,但是,由于我认为这是一个 C++ 语法技巧,我发现它与链接到它的来源无关.
  • StackOverflow 确实需要接受多个答案的可能性,但也谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多