我可以为带参数的构造函数创建类工厂吗?

塔利亚

我正在使用类工厂来动态创建对象。我使用此答案是因为它很简单(并且因为我使用的是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);

有可能吗,我该怎么办?

贾罗德42

您可以使用此修改版本

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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

您可以为类使用类似数组的构造函数吗

来自分类Dev

C ++可以将用作虚拟基础的类具有带参数的构造函数吗?

来自分类Dev

工厂创建的对象可以具有构造函数吗?

来自分类Dev

我可以为模板类的模板类型添加参数吗

来自分类Dev

C++ 可以根据给单个构造函数的参数创建派生类而不是bass 类吗?

来自分类Dev

在Java中是否可以为接口创建注释,从而强制实现类的构造函数的特定参数列表

来自分类Dev

我可以为联合的C ++函数设置默认参数吗

来自分类Dev

可以为抽象类的子类构造静态构造函数吗?

来自分类Dev

带运行时构造函数参数的委托工厂代理?

来自分类Dev

我可以在Fragments构造函数中放入参数吗

来自分类Dev

我可以在抽象基类中定义构造函数吗?

来自分类Dev

我可以在类的构造函数中使用枚举吗?

来自分类Dev

我可以在外部构造函数中为参数类型构建无参数构造函数吗?

来自分类Dev

我可以创建私有枚举构造函数吗?

来自分类Dev

当基类具有带参数的构造函数时,为什么不能创建无参数子类构造函数?

来自分类Dev

我可以有一个带有输入参数指南的打字稿类构造函数吗?

来自分类常见问题

我可以使用超类的类工厂静态方法创建子类实例吗?

来自分类Dev

我们真的可以将无参数构造函数称为默认构造函数吗?

来自分类Dev

我们真的可以将无参数构造函数称为默认构造函数吗?

来自分类Dev

我可以为登台和释放资源以不同方式参数化AWS Lambda函数吗?

来自分类Dev

在C ++中,我们可以为每个整数创建一个类吗?

来自分类Dev

我可以在函数中将类作为参数传递吗?

来自分类Dev

使用带有类型参数的工厂方法,使用参数化的构造函数创建派生类

来自分类Dev

是否可以为数组C#创建构造函数?

来自分类Dev

可以为扩展参数包“填充”默认函数参数吗?

来自分类Dev

在TypeScript中,我们可以为函数数组创建可重用的接口吗?

来自分类Dev

我可以在抽象类中创建静态工厂方法吗?

来自分类Dev

我可以显式地调用类的构造函数和析构函数吗?

来自分类Dev

我可以为多选组合框创建SelectedItems属性吗

Related 相关文章

  1. 1

    您可以为类使用类似数组的构造函数吗

  2. 2

    C ++可以将用作虚拟基础的类具有带参数的构造函数吗?

  3. 3

    工厂创建的对象可以具有构造函数吗?

  4. 4

    我可以为模板类的模板类型添加参数吗

  5. 5

    C++ 可以根据给单个构造函数的参数创建派生类而不是bass 类吗?

  6. 6

    在Java中是否可以为接口创建注释,从而强制实现类的构造函数的特定参数列表

  7. 7

    我可以为联合的C ++函数设置默认参数吗

  8. 8

    可以为抽象类的子类构造静态构造函数吗?

  9. 9

    带运行时构造函数参数的委托工厂代理?

  10. 10

    我可以在Fragments构造函数中放入参数吗

  11. 11

    我可以在抽象基类中定义构造函数吗?

  12. 12

    我可以在类的构造函数中使用枚举吗?

  13. 13

    我可以在外部构造函数中为参数类型构建无参数构造函数吗?

  14. 14

    我可以创建私有枚举构造函数吗?

  15. 15

    当基类具有带参数的构造函数时,为什么不能创建无参数子类构造函数?

  16. 16

    我可以有一个带有输入参数指南的打字稿类构造函数吗?

  17. 17

    我可以使用超类的类工厂静态方法创建子类实例吗?

  18. 18

    我们真的可以将无参数构造函数称为默认构造函数吗?

  19. 19

    我们真的可以将无参数构造函数称为默认构造函数吗?

  20. 20

    我可以为登台和释放资源以不同方式参数化AWS Lambda函数吗?

  21. 21

    在C ++中,我们可以为每个整数创建一个类吗?

  22. 22

    我可以在函数中将类作为参数传递吗?

  23. 23

    使用带有类型参数的工厂方法,使用参数化的构造函数创建派生类

  24. 24

    是否可以为数组C#创建构造函数?

  25. 25

    可以为扩展参数包“填充”默认函数参数吗?

  26. 26

    在TypeScript中,我们可以为函数数组创建可重用的接口吗?

  27. 27

    我可以在抽象类中创建静态工厂方法吗?

  28. 28

    我可以显式地调用类的构造函数和析构函数吗?

  29. 29

    我可以为多选组合框创建SelectedItems属性吗

热门标签

归档