C++ 如何绑定C++;使用luaapi的成员方法和成员变量?

C++ 如何绑定C++;使用luaapi的成员方法和成员变量?,c++,lua,C++,Lua,到目前为止,我所做的所有谷歌搜索都发现了一些非常接近的东西,但并没有完全符合我的意图 让我用最基本的方式来描述这一点: 假设你有一个C++类 class A { public: int Method(); int Variable; }; 现在想象你实例化了一个*Foo 现在,假设您有一个带有3行函数的.lua文件: function Test() local n = Foo:Method(); Foo.Variable = 0; local m =

到目前为止,我所做的所有谷歌搜索都发现了一些非常接近的东西,但并没有完全符合我的意图

让我用最基本的方式来描述这一点:

    假设你有一个C++类

    class A
    {
    public:
        int Method();
        int Variable;
    };
    
  • 现在想象你实例化了一个*Foo

  • 现在,假设您有一个带有3行函数的.lua文件:

    function Test()
        local n = Foo:Method();
        Foo.Variable = 0;
        local m = Foo.Variable;
    end
    
如何将对象A*绑定到lua,使所有这些事情都是可行的

就伪代码而言,我的第一次尝试是这样的,部分来自复制粘贴示例:

  • 在只调用一次的函数中,无论
    • 创建新图元表(MT)
    • pushvalue(-1)(我真的不明白这个)
    • 设置字段(-2,“\u索引”)
    • pushcfunction的静态版本的方法,该方法从checkudata解包a*指针
    • 设置字段(-2,“方法”)
  • 在为每个实例调用的init函数中,例如Foo:
    • 使用newuserdata创建指向Foo的指针
    • 可设置元表(MT)
    • 使用Foo设置global以使lua可以使用该名称
  • 在main中的测试函数中:
    • 通过全局名称,用上面提到的3行.lua调用一个测试函数
  • 执行此操作时,Foo:Hide();成功调用my static函数,该函数成功解包指针并调用其成员Hide()

    到目前为止,这对于:Method()很好

    然后我尝试支持.Variable访问。所有人似乎都在说,这次要再次使用元表覆盖uu index和u newindex,使它们成为一种通用的Get/Set,其中支持某些键作为有效的变量链接,例如if(key==“variable”)variable=val

    这也很有效

    问题是要把这两件事放在一起。只要您使用对变量有效的getter/setter重写_index/_newindex,Method()调用就不再调用Method()静态函数,而是进入您绑定的_index函数

    所有这些都说明,如何支持这种看似基本的用例组合

    实际的代码片段比纯粹理论上的喋喋不休更受欢迎

    提醒:请仅使用基本的C API回复,而不是第三方的内容

    Method()调用不再调用Method()静态函数,而是 改为进入绑定的_索引函数


    程序,这样如果表中存在密钥,返回第一个,否则就去GETT/SETTER。

    LUA没有C++ API,你必须使用C++的C API,只使用基本的C API,而不是第三方的东西。那你就完蛋了。毫不夸张地说。把C++对象暴露给Lua是非常复杂的,如果你不想使用外部库,你注定要重新实现它们。OP拒绝使用它们。他在C++中明确地编码了,然后我简单地说:他应该使用C++包装器。