实现C++ -to-lua观察者模式?

实现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, ...)); 
    } 
};