实现C++ to lua 观察者模式
Implementing C++ -to-lua observer pattern?
我在我的代码中实现了一个观察者(或"侦听器"(模式,如下所示:
struct EntityListener
{
public:
virtual void entityModified(Entity& e) = 0;
};
class Entity
{
public:
Entity();
void setListener(EntityListener* listener);
private:
EntityListener* m_listener;
};
现在,这在C++中起作用;Entity 类在需要时调用 entityModified()
方法。现在,我想将一些功能转移到 Lua,其中的功能点就是这个侦听器回调。实体现在是从 Lua 脚本创建的。问题是,如何在 Lua 中实现侦听器功能?
例如,Lua 脚本当前执行以下操作:
function initializeEntity()
-- The entity object is actually created in C++ by the helper
Entity = Helper.createEntity()
-- Here I'd like to hook a Lua function as the Entity's listener
end
一种可能的解决方案是在C++代码中包含一个包含指向Lua函数的"指针"的LuaListener
类,以及一个从Lua脚本调用的Lua特定的setListener
函数,该函数将Lua函数作为参数,并创建一个LuaListener
实例并将其传递给实际C++ setListener
。
所以Lua代码看起来像
function onModified(entity)
-- ...
end
function initializeEntity()
entity = Helper.createEntity()
entity.setListener(onModified)
end
C++代码看起来像(仅限伪代码(:
class LuaListener : public EntityListener
{
private:
lua_State* state;
std::string funcName;
public:
void entityModified(Entity& e)
{
// Call function `funcName` in `state`, passing `e` as argument
}
};
class LuaEntity : public Entity
{
public:
void setListenerLua(state, funcName, ...)
{
Entity::setListener(new LuaListener(state, funcName, ...));
}
};
相关文章:
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 反射 + 函数指针与观察者模式
- 观察者模式不起作用
- 观察者模式:为什么主题应该是抽象的?
- 观察者模式专业化
- 如何在不必绑定到特定类的情况下实现观察者模式
- C++,函数指针与观察者模式
- C++11观察者模式(信号、插槽、事件、更改广播器/侦听器,或任何您想称之为的东西)
- 实施观察者模式C
- C++自己的观察者模式
- 不同可观察量的观察者模式
- 通过Boost信号的观察者模式2
- 具有类型信息的观察者模式(C++)
- 代码设计:观察者模式
- 观察者模式和继承:未调用正确的函数
- C++和Qt:观察者模式错误
- 在C++中实现观察者模式
- 多少听众是太多的观察者模式
- 当观察者希望观察不同的项目时实现观察者模式
- 实现C++ to lua 观察者模式