在 C++ 中注册实现的方法
Register implemented methods in c++
我正在用C++编写一个游戏引擎。现在我有一个名为 GameListener
的类,它有一些游戏状态回调方法(如 update()
、start()
、awake()
)。因此,GameObject
应该实现其中任何一个实际上是一个GameObject
。这很像Unity3D。
然而,问题是,无论GameObject
是否实现了某个方法,它都是由引擎调用的。所以我最终可能会得到一堆基本上什么都不做的空白方法。我怎样才能避免这种情况?以某种方式注册所有已实现的方法并调用它们。在我的游戏循环中,我有这样的东西(伪代码):
for all gamelisteners do:
gamelistener.awake();
gamelistener.update();
gamelistener.another_some_callback_method();
...
如果我有一些少量的游戏侦听器和回调方法,这不是问题。但是,如果我在 GameListener 界面中有 200 个游戏侦听器和 10 个回调方法呢?并非所有游戏侦听器都实现了这 10 个回调方法,因此,我最终得到了一堆空白方法,这些方法在游戏循环中调用。
我听说在 C# 中,这可以通过反射以某种方式解决(查看实际实现了哪些方法,并仅调用它们)。如何在 c++ 中解决此问题?
我有一个实现是我有函数指针的结构,"实现者"(在你的例子中是游戏对象)应该实现并将这些函数指针注册到主框架(游戏引擎)。
因此,如果实现者为特定回调注册了 nullptr,则框架应跳过向该实现者暗示此事件。
另一方面,如果您有需要实现的强制回调,则游戏引擎不应允许向其注册游戏对象,除非它实现了这些回调。
using callback_defn1 = std::function<void()>;
using callback_defn2 = std::function<void(int)>;
struct gameengine_callbacks {
callback_defn1 mandatory_callback1;
callback_defn1 mandatory_callback2;
callback_defn2 optional_callback1;
};
在游戏引擎上类似
void GameEngine::register_objects(gameengine_callbacks callbacks)
{
if (callbacks.mandatory_callback1 == nullptr or callbacks.mandatory_callback1 == nullptr)
{
throw std::invalid_argument("some msg");
}
// Proceed with your registration.
}
相关文章:
- 使用非递归插入方法实现 AVL 树
- C++方法实现:是否可以避免每次都键入类名?
- 如何使用吸气剂方法实现C++封装
- 在C++中使用克隆方法实现多晶型效果
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 双向链表插入方法实现 - 正在搜索哪个节点
- 没有虚拟调度的默认方法实现
- C 构造函数和方法实现
- C :如何使用相同的数据类使用不同的方法实现
- 将同一类的方法实现放在不同的对象文件中
- 私有方法实现编译错误
- 使用公共命名方法实现非公共赋值运算符
- 使用 SFINAE 在 Clase 模板中选择不同的方法实现
- 如何根据方法实现的声明顺序对其进行排序
- 使用一个方法实现不同类型赋值的优雅方式,并且没有警告
- 在运行时选择方法实现
- 将参数传递给c++ CORBA方法实现
- 静态constexpr方法实现导致GCC错误
- 包括c++中的头文件(类定义和方法实现)
- 如何在swig生成的代理类中更改特定的方法实现