代码之家  ›  专栏  ›  技术社区  ›  anon

C++类与Lua

  •  2
  • anon  · 技术社区  · 16 年前

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

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

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

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

    我想要的是,创建我自己的HTTC++对象,并让Lua有一个方法来获取/设置它们。

    有人对此有很好的教程/链接吗?

    坦克!

    4 回复  |  直到 16 年前
        1
  •  6
  •   Norman Ramsey    16 年前

    一种选择是使用 USER数据,它允许您在C++堆上分配对象。参见文档 lua_pushlightuserdata . 不幸的是,轻型用户数据没有元表。即使您愿意使用Lua访问它 功能 要进行获取/设置,您还必须执行以下操作:

    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++堆上分配对象,而不是在LUA堆上分配。

        2
  •  1
  •   dash-tom-bang    16 年前

    好像工厂是去的路吗?例如,您可以调用一个函数来创建和销毁,而不是通过“标准”方式在Lua中动态地创建对象吗?

        3
  •  1
  •   ted_j    16 年前

    我似乎记得一个同事正在进行这样的事情,Lua和C++都是第一类公民,在两个方向上都是完全可以操作的。

    如果记忆对我有用的话,它是基于 Lua++ 但现在我不确定,对不起。

        4
  •  0
  •   Alexander Gladysh    16 年前

    使用新位置。见 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;
    }
    

    (未测试,请参阅上面的链接了解详细信息。)