从lua脚本中创建一个新的c ++对象?

时间:2017-10-10 12:31:35

标签: c++ lua

--- ---上下文

我想要一个名为" fileProcessor"的类。这个类是完全静态的,只是作为一个方便的命名空间(在我的常规库命名空间内)用于某些全局函数。这是班级的基本蓝图,只有相关的东西

class fileProcessor{
private:
    lua_State* LUA_state;
public:
    static std::variant<type1,type2> processFile(const char* filePath,const char* processorScript);
}

请再次注意,我忽略了课堂上的大部分内容,所以如果有什么事情似乎很奇怪,请忽略它。

应该做什么进程文件:

  1. 读取filePath文件,存储包含它的所有指令(这是我自己的文件类型或语法风格。这已经正确处理了)。指令存储有字符串,一个用于命令,一个用于后面的所有内容。
  2. 阅读脚本文件并检查顶部是否有注释掉的fileProcessor行。这是为了确保加载的lua脚本是相关的而不是一些随机行为脚本
  3. 加载并编译lua脚本。
  4. 使所有读取指令可用(它们保存在前面提到的2个字符串的结构中)
  5. 运行该文件并收回一个对象。该对象应该只是我在返回类型(变体)
  6. 中列出的类型

    我遇到了第4步的问题,也是脚本编写的一个重要部分。

    --- ---问题

    如何在lua中创建一个完整的新对象type1或type2,从lua中写入它然后从lua堆栈返回到c ++并仍然知道它的type1还是type2?

    ---没有提供示例,因为这个问题更为一般,我提供课程的唯一原因是上下文.---

1 个答案:

答案 0 :(得分:2)

看起来你正试图以相反的方式去做。我引用了this回答的一部分:

  

...你期望Lua成为主要语言,而C ++成为客户端。问题是,Lua C界面的设计并不像那样,Lua意味着是客户端,而所有的努力工作都是用C语言编写的,这样Lua可以毫不费力地调用它。

如果您确信没有其他方法可以按照其他方式执行此操作,则可以按照that给出的解决方法进行操作。否则,我认为你可以通过使用LUA来实现你所需要的。

LUA有8种基本类型( nil,boolean,number,string,userdata,function,thread, table )。但是,您可以根据需要添加新类型,方法是在本机C ++中创建一个类作为新类型并使用LUA注册它。

您可以通过以下方式注册:

  1. 使用一些用于C ++的LUA助手,例如luna.h (as shown in this tutorial)
  2. 使用C ++类(check this answer)推送新的lua表。
  3. 类对象实例在您的本机C ++代码中创建并传递给LUA。然后LUA使用类接口给出的方法。