【问题标题】:Creating a new c++ object from within a lua script?从 lua 脚本中创建一个新的 c++ 对象?
【发布时间】:2017-10-10 22:14:12
【问题描述】:

---上下文---

我想要一个名为“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. 运行文件并返回一个对象。该对象只能是我在返回类型(变体)中列出的类型

我在第 4 步和脚本的一个重要部分遇到问题。

---问题---

我怎样才能在 lua 中创建一个全新的 type1 或 type2 对象,从 lua 中写入它,然后从 lua 堆栈中将其返回到 c++ 中,并且仍然知道它是 type1 还是 type2?

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

【问题讨论】:

  • 你是如何在c++中运行lua的,你使用的是哪个库?
  • @BjørnMoholt 这与我的问题有关吗?我正在使用您可以从网站获得的普通 lua 库。 lua.org/pil/24.1.html最后几段解释了如何在c++中使用它
  • 可能是,根据不同的lua库,我没有同时使用lua和c++的经验,所以我不知道支持什么样的东西,所以我必须检查一下文档,这意味着我必须知道您使用的是哪个库。另一种方法是随机选择一个并希望获得最好的结果,但这似乎并不谨慎。
  • @BjørnMoholt 我正在使用 lua 组织提供的 c api。
  • 问题是如何区分来自LUA的“对象”类型与原生类型?

标签: c++ lua


【解决方案1】:

您似乎正在尝试以相反的方式进行操作。我引用this的一部分答案:

...您期望 Lua 成为主要语言,而 C++ 成为客户端。问题是,Lua C 接口不是这样设计的,Lua 是作为客户端的,所有的辛苦工作都是用 C 编写的,这样 Lua 可以毫不费力地调用它。

如果您确信没有其他方法可以绕过您可以按照that 答案给出的解决方法。否则,我认为您可以通过使用 LUA 来实现您所需要的。

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

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

  1. 为 C++ 使用一些 LUA 助手,例如 luna.h (as shown in this tutorial)
  2. 使用 C++ 类 (check this answer) 推送新的 lua 表。

类对象实例在您的本机 C++ 代码中创建并传递给 LUA。 LUA 然后使用类接口提供的方法。

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 2014-09-27
    • 2017-01-20
    • 2016-05-25
    • 2012-10-23
    • 2021-08-14
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多