实现C++ -to-lua观察者模式?
问题描述:
我有一个观察者(或“监听”)图案在我的代码实现为这样:实现C++ -to-lua观察者模式?
struct EntityListener
{
public:
virtual void entityModified(Entity& e) = 0;
};
class Entity
{
public:
Entity();
void setListener(EntityListener* listener);
private:
EntityListener* m_listener;
};
现在,这种工作在C++;实体类在需要时调用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
答
一个可行的办法是有一个LuaListener
类在C包含一个“指针”到Lua函数++代码,和一个Lua -specific setListener
函数从Lua脚本中调用,并将Lua函数作为参数,并创建一个LuaListener
实例并将其传递给实际的C++ setListener
。
所以Lua代码会看起来像
function onModified(entity)
-- ...
end
function initializeEntity()
entity = Helper.createEntity()
entity.setListener(onModified)
end
而且C++代码看起来是这样的(仅pseudoish码):
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, ...));
}
};