C++ 工厂使用 Lua。

我有一个脚本:

  • 自定义语言只用于数据
  • 使用C ++中的Script类加载
  • 我有像Type等标记
  • 一个用于获取标记值的接口- Script :: GetValue(Tag,T&value)

脚本的使用方式如下:

Script * script(“someFile”);
script->GetValue(“Type”,type);
Object * obj = CreateObject(type);
obj->Load(script);

其中Object的Load函数用于加载对象的其他参数。现在我将脚本语言更改为lua。我的问题是:

我应该保留这种创建对象的方式(仅使用lua进行数据)还是应该在lua中公开工厂并从lua中使用它,类似于以下内容(在lua中):

CreateObject(“someType”)
SetProperty(someObj,someProperty,someValue)

首先,我想知道哪一种方法更快。您有其他建议吗?因为我正在重构这个部分,所以我对其他建议很开放。我想保留lua,因为它快速,易于集成且小巧。

原文链接 https://stackoverflow.com/questions/5281487

点赞
stackoverflow用户1491
stackoverflow用户1491

在这种情况下,我更喜欢设置一个有限的 C 函数,它以参数表作为参数。因此,Lua 脚本看起来像以下这样。

CreateObject{
    Type = "someType",
    someProperty = someValue,
    -- ...
}

该参数表将在回调函数中位于堆栈顶部,可以使用 lua_getfield 按名称访问所有参数。

您可能还想探索 沙盒化您的 Lua 环境

2011-03-13 13:32:44
stackoverflow用户263356
stackoverflow用户263356

第一种方法很可能更快,但第二种方法可能会导致更少的对象初始化代码(假设您正在初始化大量对象)。如果您选择第一种方法,您可以手动执行它。如果您选择第二种方法,您可能希望使用像Luabind这样的绑定库来避免错误并加快实现时间,假设您正在为多种对象类型和数据类型执行此操作。

最简单的方法可能只是使用Lua来处理数据;如果要公开对象并通过Lua使用它,请确保值得努力。

2011-03-14 09:05:19
stackoverflow用户664216
stackoverflow用户664216

根据您的需求,可以允许您的脚本环境创建C ++对象或不允许。

tolua ++使用所有元表功能,以允许在lua中非常简单地操作c ++类型。

例如,此声明:


// tolua_begin
class SomeCppClass
{
public:
   SomeCppClass();
   ~SomeCppClass();

   int some_field;
   void some_method();
};
// tolua_end

将自动生成lua绑定,以便允许此lua脚本:


#!lua
-- obj1 must be deleted manually
local obj1 = SomeCppClass:new()
-- obj1 will be automatically garbage collected
local obj2 = SomeCppClass:new_local()

obj1.some_field = 3 -- direct access to "some_field"
obj2:some_method() -- direct call to "some_method"

obj1:delete()

这种技术的优点是,您的lua代码将与C ++代码非常一致。请参见[http://www.codenix.com/~tolua/tolua ++.html](http://www.codenix.com/~tolua/tolua ++.html)

2011-03-17 13:08:24