首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中注册实现的方法

在c++中注册实现的方法
EN

Stack Overflow用户
提问于 2016-02-26 23:24:41
回答 1查看 99关注 0票数 0

我正在用C++编写一个游戏引擎。现在我有一个名为GameListener的类,它有一些游戏状态回调方法(如update()start()awake())。因此,GameObject应该将它们中的任何一个实现为实际的GameObject。这很像Unity3D。

然而,问题是,无论GameObject是否实现了某个方法,它都是由引擎调用的。所以我最终会得到一堆空白的方法,基本上什么也不做。我怎样才能避免这种情况?以某种方式注册所有已实现的方法并调用它们。在我的gameloop中,我有类似这样的东西(伪代码):

代码语言:javascript
复制
for all gamelisteners do:
gamelistener.awake();
gamelistener.update();
gamelistener.another_some_callback_method();
...

如果我有少量的gamelisteners和回调方法,这不是问题。但是,假设我在GameListener接口中有200个GameListener和10个回调方法,那会怎么样呢?并不是所有的gamelisteners都实现了这10个回调方法,因此,我最终得到了一堆在gameloop中调用的空方法。

我听说在C#中,这个问题可以通过反射来解决(查看实际实现了哪些方法,并只调用它们)。我如何在c++中解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2016-02-26 23:36:36

我有一个实现,我有一个函数指针的结构,“实现者”(在你的例子中是GameObject )应该实现并注册那些指向主框架(GameEngine)的函数指针。

因此,如果实现者为特定的回调注册了一个nullptr,那么框架应该跳过告知这个实现者这个事件。

另一方面,如果您有需要实现的强制回调,那么Gameengine不应该允许向它注册Gameobject,除非它实现了这些。

代码语言:javascript
复制
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;
};

在GameEngine上类似这样的东西

代码语言:javascript
复制
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.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35655534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档