【问题标题】:c++ classes & luac++类和lua
【发布时间】:2010-05-07 09:59:12
【问题描述】:

我想拥有可以在 C++ 和 Lua 中读/写的 C++ 对象。

我看过:http://www.lua.org/pil/28.html

但是,我不喜欢这种解决方案,因为我的对象具有构造函数和析构函数(而且它们很重要,因为我使用 RAII 并且它们负责引用计数)。

我不喜欢 PIL 解决方案中的对象是在 Lua 的堆中分配的。

我想要的是自己创建 hte C++ 对象,并且让 lua 有办法对它们进行获取/设置。

有人有这方面的好教程/链接吗?

坦克!

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    一种选择是使用 light 用户数据,它允许您在 C++ 堆上分配对象。请参阅lua_pushlightuserdata 的文档。不幸的是,轻量级用户数据没有元表。即使您愿意使用 Lua functions 访问它来执行 get/set,您仍然必须执行以下操作:

    static int myget(lua_State *L) {
       myclass thing = lua_touserdata(L, 1);
       lua_pushnumber(thing::getsize());
       return 1;
    }
    

    不幸的是,因为它是一个轻量级用户数据,所以没有真正的方法可以使这个操作类型安全——所有轻量级用户数据都被同等对待,并且它们没有元表。

    更好的解决方案是在 Lua 堆上分配完整的用户数据, 使用适当的元表,其内容是单个指针,指向在 C++ 堆上分配的对象.然后您可以按照Lua 编程 中的模型进行操作。例如,您可以查看 Lua io 库以了解如何处理 FILE *。这样,您可以使用luaL_checkudata 函数编写您的 C 接口,它们是安全的,但您仍然有权在 C++ 堆而不是 Lua 堆上分配对象。

    【讨论】:

      【解决方案2】:

      看起来像工厂是要走的路?例如。除了通过“标准”方式在 Lua 中动态创建对象之外,您还可以调用 Create 和 Destroy 函数吗?

      【讨论】:

      • err,Lua 进行内存分配;您建议使用适当的构造函数?
      • 我是说你调用一个用 C 或 C++ 实现的函数来新建和删除你的对象,然后你把它交给 Lua 让它包装或做任何事情。与尝试挂钩 Lua 内存分配方案相比,这似乎不太容易出现问题,但我不得不承认我从未做过这样的事情。简而言之,Lua 只知道指针。您的工厂函数(Thing* CreateThing() 和 void DestroyThing(Thing*))负责实际的 C++ 魔法。
      【解决方案3】:

      我似乎记得有一位同事正在做这种事情,Lua 和 C++ 对象都是一等公民,并且在两个方向上都完全可操作。

      如果我没记错的话,它是基于 Lua++ 但现在我不确定,抱歉。

      【讨论】:

        【解决方案4】:

        使用新的展示位置。请参阅here 以获取方便的模板:

        template< typename T >
        void my_newuserdata( lua_State * L ) {
           new ( reinterpret_cast< T * >( lua_newuserdata( L, sizeof( T ) ) ) ) T();
        }
        
        template< typename T >
        int my_gc( lua_State * l ) {
           reinterpret_cast< T * >( lua_touserdata( L, 1 ) )->~T();
           return 0;
        }
        

        (未经测试,详情请参见上面的链接。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-16
          • 1970-01-01
          • 2012-04-30
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          • 1970-01-01
          • 2015-03-29
          相关资源
          最近更新 更多