实现C++到Lua的观察者模式?

3

我在我的代码中实现了观察者(或“监听器”)模式,如下所示:

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
1个回答

3

一个可能的解决方案是在您的C++代码中拥有一个LuaListener类,其中包含指向Lua函数的“指针”,以及一个Lua特定的setListener函数,该函数从Lua脚本中调用,接受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, ...));
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接