gpt4 book ai didi

用于传递具有继承层次结构的事件的 C++ 系统

转载 作者:太空宇宙 更新时间:2023-11-04 12:12:43 26 4
gpt4 key购买 nike

我目前正在用 C++ 为游戏编写一个事件传递系统,我认为如果事件以一种合乎逻辑的方式相互继承将会很有用。

这意味着我可以引发一个 NukeExplosion 类型的事件,它派生自 Explosion(它可能派生自一个空的基类 Event) 并且它会被传递给所有监听器以接收 NukeExplosion 类型的事件,以及更通用的 Explosion

到目前为止,我能够提出两种可能的解决方案:

  • 对同一事件类型的每组监听器的事件执行dynamic_cast。如果成功,我就可以将事件传递给集合中的所有监听器。
  • 向每个事件类型添加一段代码,再次引发事件,但使用更通用的类型。然后,使用 typeid 运算符的结果以及监听器映射将事件传递给监听器。

我不太喜欢第二种选择,因为它容易出错,而且要求我在每个事件类中编写几乎相同的代码。

第一个选项的问题是它可能需要做很多 dynamic_cast,我想避免这种情况。

那么,还有没有其他我没有考虑过的方法,或者第一个选项是我能做的最好的吗?或者我应该完全放弃事件的继承?

最佳答案

我几乎就是带着这个问题来到这里的。问题基本上是 C++ 不允许像 handle (ExplosionEvent *e) 这样的函数。接受一个论点 e静态类型 Event *即使是 e 的动态类型是ExplosionEvent * .拥有这将是一个不错的功能,但我不太确定语言还需要更改什么。

访客模式是我能想到的最干净的解决方案。缺点是它很冗长,而且可能不会比 dynamic_cast<> 便宜。 .

主要.hpp:

#include <iostream>

class Event;
class Handler;

#include "Event.hpp"
#include "Handler.hpp"

事件.hpp:

#ifndef EVENT_H
#define EVENT_H

class Event
{
public:
virtual void accept (Handler *handler) { }
};

class ExplosionEvent : public Event
{
void accept (Handler *handler);
};

#endif // !EVENT_H

事件.cpp:

#include "Main.hpp"

void
ExplosionEvent::accept (Handler *handler)
{
handler->handleExplosion (this);
}

处理程序.hpp:

#ifndef HANDLER_H
#define HANDLER_H

class Handler
{
public:
void handle (Event *event) { event->accept (this); }
virtual void handleExplosion (ExplosionEvent *explosionEvent) { }
};

class ExplosionHandler : public Handler
{
void handleExplosion (ExplosionEvent *explosionEvent);
};

#endif // !HANDLER_H

处理程序.cpp:

#include "Main.hpp"

void
ExplosionHandler::handleExplosion (ExplosionEvent *explosionEvent)
{
std::cout << "BOOM!" << std::endl;
}

主要.cpp:

#include "Main.hpp"

int
main (int argc, char *args)
{
Event *event = new ExplosionEvent;
Handler *handler = new ExplosionHandler;
handler->handle (event);
}

编译运行:

$ g++ -o boom *.cpp
$ ./boom
BOOM!
$

关于用于传递具有继承层次结构的事件的 C++ 系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9151889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com