工厂法C++

问题描述 投票:0回答:1

我是一个C++的初学者,我试图解决工厂方法的实现,我试图寻找与funcion的实现。作物 下面是。

  1. 重新驱动返回类型,以提供对创建对象的访问。 下图。
  2. 创建两个对象(对象2对象3),对于给定的 身份证
  3. 试图做到线程安全。

我正在处理下面的代码。

enum ObjectType {
    FO_Object2, FO_Object3
};

class Object {
    int ID;
public:
    Object(int id) : ID(id) {}
    Object(const Object&) = delete;

    virtual void printObject() = 0;
    static Object* make_object(int id);
};

class Object2: public Object
{
public:
    void printObject() {
        std::cout << "ID = 2" << std::endl;
    }
};

class Object3 : public Object
{
public:
    void printObject() {
        std::cout << "ID = 3" << std::endl;
    }
};

//Factory Method to create objects
Object* Object::make_object(int id)
{
    switch (id)
    {
        case FO_Object2: return new Object2();
        case FO_Object3: return new Object3();
        default:
            return NULL;
    }
}

class object_factory
{
public:
    object_factory()
    {
        ObjectType id = FO_Object3;
        pObject = Object::make_object(id);
    }
    ~object_factory()
    {
        if (pObject) {
            delete[] pObject;
            pObject = NULL;
        }
    }
    Object* getFactory() {
        return pObject;
    }
private:
    Object* pObject;
};

int main()
{
    object_factory* pFactory = new object_factory();
    Object* pObject = pFactory->getFactory();
    pObject->printObject();

    return 0;
}

但不幸的是,在我的错误列表中,我发现了以下错误:

E1790 --> "Object2 "的默认构造函数不能被引用 -- 它是一个被删除的函数。

E1790 --> "Object3 "的默认构造函数不能被引用 -- 它是一个被删除的函数。

C2280 --> 'Object2::Object2(void)': 试图引用一个被删除的函数。

谁能帮我解决这个问题,先谢谢了。

c++11 design-patterns factory-method
1个回答
0
投票

这里是一个纠正的例子(据我了解,你想实现什么)。请参阅代码注释,澄清为什么东西在哪里改变。很多东西都需要使核心更加强大(例如在基类中使用ObjectType)。

#include <iostream>

enum ObjectType {
    FO_Object2 = 2,
   FO_Object3 = 3
};

class Object {
public:
    int ID; // ID must be public so that inherited class can access it. Otherwise create getter for ID
    Object(int id) : ID(id) {};
    Object(const Object&) = delete;

    virtual void printObject() = 0;
    static Object* make_object(int id);
};

class Object2: public Object
{
public:
    Object2():Object(2) {}; // specifically instanciate a base class whose id is 2
    void printObject() {
        std::cout << "ID = "<< ID << std::endl;
    }
};

class Object3 : public Object
{

public:
    Object3():Object(3) {}; // specifically instanciate a base class whose id is 3
    void printObject() {
        std::cout << "ID = "<< ID << std::endl;
    }
};

//Factory Method to create objects
Object* Object::make_object(int id)
{
    switch (id)
    {
        case FO_Object2: return new Object2();
        case FO_Object3: return new Object3();
        default:
            return NULL;
    }
}

class object_factory
{
public:
    object_factory()
    {
        ObjectType id = FO_Object3;
        pObject = Object::make_object(id);
    }
    ~object_factory()
    {
        if (pObject) {
            delete[] pObject;
            pObject = NULL;
        }
    }
    Object* getFactory() {
        return pObject;
    }
private:
    Object* pObject;
};

int main()
{
    object_factory* pFactory = new object_factory();
    Object* pObject = pFactory->getFactory();
    pObject->printObject();

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.