C++模板方法来创建对象

C++ template method to create objects

本文关键字:创建对象 模板方法 C++      更新时间:2023-10-16

我正在使用Luabind向Lua公开我的游戏引擎。我最近遇到了麻烦,因为我发现我没有办法在Lua中创建一个"新的",例如GUIObject*obj=new GUIObject(),而在Lua内创建的所有东西都归Lua所有。

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

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。

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

感谢

由于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(); }
};