我正在使用类工厂来动态创建对象。我使用这个答案是因为它的简单性(并且因为我使用的是 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);
有可能吗,我该怎么做?