我正在使用类工厂来动态创建对象。我使用此answer是为了简化操作(并且因为我使用的是Qt)。
但是现在我意识到我必须在构造函数中添加一个参数
Item(bool newItem /* = true*/);
代替
Item();
对于所引用答案中的代码:
template <typename T>
class ClassFactory
{
public:
template <typename TDerived>
void registerType(QString shape)
{
_createFuncs[shape] = &createFunc<TDerived>;
}
T* create(QString shape)
{
typename QMap<QString, PCreateFunc>::const_iterator it = _createFuncs.find(shape);
if (it != _createFuncs.end())
{
return it.value()();
}
return NULL;
}
private:
template <typename TDerived>
static T* createFunc()
{
return new TDerived();
}
typedef T* (*PCreateFunc)();
QMap<QString, PCreateFunc> _createFuncs;
};
我上课了
classFactory.registerType <Type1_Item> ("type1");
需要时我打电话给
Item* item = classFactory.create("type1");
我试图在类工厂中添加一个附加参数,以表示构造函数参数,但是我的尝试均导致错误。
我为什么需要它:简单的情况:
为了能够调用“加载”功能,必须存在一个对象-这意味着如果我创建一个新对象,即使我不需要它也会触发一个打开文件对话框。
我看到的解决方法是,先构造一个构造函数,然后再建立一个设置函数。但是...这意味着构造一个对象总是需要2函数调用,这似乎是一个糟糕的设计。
这就是为什么我正在寻找一种使用简单的调用来注册和调用类的方法
classFactory.registerType <Type1_Item> ("type1", bool);
Item* item = classFactory.create("type1", true);
有可能吗,我该怎么办?
最佳答案
您可以使用此修改版本
template <typename T, typename ... Ts>
class ClassFactory
{
public:
template <typename TDerived>
void registerType(QString shape)
{
_createFuncs[shape] = &createFunc<TDerived>;
}
T* create(QString shape, Ts... args)
{
typename QMap<QString, PCreateFunc>::const_iterator it = _createFuncs.find(shape);
if (it != _createFuncs.end())
{
return it.value()(args...);
}
return nullptr;
}
private:
template <typename TDerived>
static T* createFunc(Ts... args)
{
return new TDerived(args);
}
typedef T* (*PCreateFunc)(Ts...);
QMap<QString, PCreateFunc> _createFuncs;
};
并使用它
ClassFactory<Item, bool> classFactory;
classFactory.registerType <Type1_Item> ("type1");
Item* item = classFactory.create("type1", true);