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

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

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
点赞
用户440558
用户440558

一种可能的解决方案是在 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)
    {
        // 调用 `state` 中的 `funcName` 函数,将 `e` 作为参数传递
    }
};

class LuaEntity : public Entity
{
public:
    void setListenerLua(state, funcName, ...)
    {
        Entity::setListener(new LuaListener(state, funcName, ...));
    }
};
2014-12-02 12:17:30