【问题标题】:C++ template method to create objectsC++模板方法创建对象
【发布时间】:2012-08-14 02:04:50
【问题描述】:

我正在使用 Luabind 将我的游戏引擎暴露给 Lua。 我最近遇到了麻烦,因为我发现我无法创建一个“新”,例如在 Lua 中 GUIObject * obj = new GUIObject(),而在 Lua 中创建的所有东西都归 Lua 所有。

这不是一个大问题,我决定在对象上创建一种工厂模式,例如我的 GUIManager 有

class GUIManager {
template <class T> T * CreateObject( T classType )
{
    return new T();
}
}

我的 Luabind 绑定看起来像这样:

class_<GUIManager>("GUIManager")
         .def("CreateObject", (GUILabel*(GUIManager::*)(GUILabel classType))&GUIManager::CreateObject<GUILabel>)
         .def("CreateObject", (GUIImage*(GUIManager::*)(GUIImage classType))&GUIManager::CreateObject<GUIImage>)

通过调用在 Lua 中找到所有工作:

testLabel = theGUI:CreateObject(GUILabel())

但是我觉得这不是“正确的”,因为我实际上是在创建一个要传入的对象,我确信有一种更简单的方法,但到目前为止我尝试过的所有其他方法都不同意编译器或 Luabind。

如果需要,请随时询问更多信息

谢谢

【问题讨论】:

  • 如果你将传递一个指针,你就不需要创建对象模板 T * CreateObject( T *classPtr ) {return new T();} 允许:testLabel = theGUI:CreateObject ((GUILabel *) NULL);和模板 void CreateObject( T *&classPtr ) { classPtr = new T(); } 仅用于:theGUI:CreateObject(testLabel);
  • 使用该方法如何让 Lua 知道我要创建哪个对象?据我所知,我最终会遇到与之前相同的问题,不知道要使用两个绑定函数中的哪一个并引发错误。

标签: c++ templates lua luabind


【解决方案1】:

由于您的 Luabind 绑定使用您的 CreateObject 方法的显式实例化,您可以将每个实例绑定到不同的名称:

class_<GUIManager>("GUIManager")
         .def("CreateLabel", /*...*/&GUIManager::CreateObject<GUILabel>)
         .def("CreateImage", /*...*/&GUIManager::CreateObject<GUIImage>)

然后,您的 Lua 代码可以“简化”为:

testLabel = theGUI:CreateLabel()

而且您的工厂方法中不再需要参数。

class GUIManager {
    template <class T> T * CreateObject() { return new T(); }
};

【讨论】:

  • 完美!非常感谢您的回答!
猜你喜欢
  • 2013-03-31
  • 2021-12-11
  • 2014-06-05
  • 2019-05-05
  • 2018-04-18
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
相关资源
最近更新 更多