Фабричный метод C ++ - PullRequest
       39

Фабричный метод C ++

0 голосов
/ 24 апреля 2020

Я новичок в C ++, и я пытался решить эту реализацию фабричного метода, где я пытаюсь найти реализацию с помощью функции make object ниже:

  1. Извлечение возвращаемого типа для предоставления доступа к созданному объекту в классе Object ниже.
  2. Создание двух объектов ( Object2 и Object3 ) для данного id
  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 ) ': попытка сослаться на удаленную функцию

Любой может помочь мне с этой проблемой, спасибо в заранее.

1 Ответ

0 голосов
/ 24 апреля 2020

Вот исправленный образец (насколько я понял, чего вы хотите добиться). Смотрите комментарии к коду, поясняющие, почему материал изменился. Чтобы сделать ядро ​​более устойчивым, потребуется гораздо больше (например, с помощью 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;
}
...