【问题标题】:Using a Factory to create a class, which is used in another class使用工厂创建一个类,该类在另一个类中使用
【发布时间】:2015-10-23 14:22:04
【问题描述】:

我有以下情况:

工厂类实现:

class FactoryClassA {
    public:
        FactoryClassA(){};
        ~FactoryClassA(){};

        ClassA create(double a, double b) {
            return ClassA;
        };
};

A 类实现:

class ClassA {
    friend class FactoryClassA
    ~FactoryClassA() {}
    private:
        ClassA(double a = 0, double b = 0)
        {
            a(a),
            b(b)
        };
        double a;
        double b;
};

其他类实现:

class OtherClass {
    public:
        OtherClass() {
            ClassFactory myClassAFactory;
            aClassA = myClassAFactory.create();
        }
        ~OtherClass() {};

    private:
        aClassA;
};

很遗憾,这不起作用。因为在OtherClass的(空)成员初始化列表中,调用了ClassA的空构造函数,不存在。

我之所以制作ClassAprivate的构造函数,是因为我希望用户只通过FactoryClassA创建ClassA的对象。

【问题讨论】:

  • 那么,问题是什么?
  • 请修正您的代码:缩进并添加;
  • 1.您不要将 FactoryClassA 的析构函数放在另一个类中。 2. ClassFactory 未定义。 3.friend应该在大括号之外。
  • 我强烈建议你从可编译的代码开始。您发布的代码有多个语法错误。
  • 编辑:3.友好的成员在括号中。您是否正在尝试将 destruct0r 提供给 ClassA?

标签: c++ oop polymorphism


【解决方案1】:

首先,create() 应该有一个返回类型:

ClassA create(double a, double b) {
   return {a, b};
}

我没有解决所有其他语法错误。请修复它们,因为其他人在搜索答案时可能会发现您的问题。请让他们轻松理解您的问题。

这必须在定义ClassA 之后出现在您的代码中,因为编译器必须知道ClassA 对象的大小以及要使用的构造函数。

其次,只需在构造函数主体之前初始化你的成员:

OtherClass() :
   aClassA{ClassFactory{}.create(0.0, 0.0)}
{}

您可能更喜欢将create() 作为ClassFactory 的静态成员函数。那么OtherClass 构造函数如下所示:

OtherClass() :
   aClassA{ClassFactory::create(0.0, 0.0)}
{}

这样更直观。

【讨论】:

    【解决方案2】:

    此代码充满了小错误,使其无法使用。类的成员初始化的第一个语法是:

    class A {
        A(x, y): m_a(x) { ... }
        ...
    }
    

    和类声明是语句,所以它们需要最后的;

    接下来,如果您希望能够使用临时对象,则类的 dtor 必须是公共的。

    默认值不应在ClassA ctor 中,而应在create 工厂方法中。

    最后,你应该在OtherClass中使用静态工厂,不需要为每个对象创建一个新工厂。

    代码变成:

    class FactoryClassA;
    
    class ClassA {
    public:
        friend class FactoryClassA;
        ~ClassA(){}
    private:
        ClassA(double a, double b):a(a),b(b){}
        double a;
        double b;
    };
    
    class FactoryClassA {
    public:
        FactoryClassA(){}
        ~FactoryClassA(){}
    
        ClassA create(double a = 0, double b = 0) {
            return ClassA(a, b);
        }
    };
    
    class OtherClass {
    public:
        OtherClass(): aClassA(myClassAFactory.create()){}
        ~OtherClass(){}
    
    private:
        static FactoryClassA myClassAFactory;
        ClassA aClassA;
    
    };
    
    FactoryClassA OtherClass::myClassAFactory;
    

    离原版不远,但是这个可以编译...

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 1970-01-01
      • 2014-06-21
      • 2016-01-21
      • 1970-01-01
      • 2019-03-25
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多