Это лучший способ написать мой метод фабрики

Мое намерение — создать пустую виртуальную функцию в базовом классе. Переопределите эту функцию в производных классах так, чтобы они возвращали объект конкретного подкласса.

createShapeObjects это фабричный метод здесь.

Какова правильная реализация для фабричного метода в соответствии с GOF книга?

facto.h

#ifndef FACTO
#define FACTO

class PaintShapes
{
public:
virtual PaintShapes createShapeObjects(string arg) {};
};

class PaintTriangle : public PaintShapes
{
public:
PaintTriangle() {}

virtual PaintShapes createShapeObjects(string arg)
{
std::cout << "ddd";
if (arg == "triangle")
return new PaintTriangle;
}
};

class PaintRectangle : public PaintShapes
{
public:
PaintRectangle() {}

virtual PaintShapes createShapeObjects(string arg)
{
std::cout << "eee";
if (arg == "rectangle")
return new PaintRectangle;
}
};/////
// My class which wants to paint a triangle:
/////

class MyClass
{
public:
PaintShapes obj;
void MyPaint()
{
obj.createShapeObjects("triangle");
}
};#endif // FACTO

main.cpp

#include <iostream>

using namespace std;
#include "facto.h"int main()
{
cout << "Hello World!" << endl;

MyClass obj;
obj.MyPaint();
return 0;
}

Это дает ошибку:

error: could not convert '(operator new(4u), (<statement>, ((PaintTriangle*)<anonymous>)))' from 'PaintTriangle*' to 'PaintShapes'
return new PaintTriangle;
^

0

Решение

Я не понимаю ничего из этого.

Цель фабричного метода — создать экземпляр производного класса без непосредственного вызова его конструктора. Но ваш код находится в ситуации Catch-22 — например, сделать PaintRectangle Вы должны иметь существующий экземпляр такого объекта в первую очередь! Я надеюсь, что вы видите, что это ни к чему не приведет.

Попробуйте что-то вроде этого:

class PaintShape
{
public:
static PaintShape *createShapeObject(std::string shape);
};

class PaintTriangle : public PaintShape
{
public:
PaintTriangle() { }
// ...
};

class PaintRectangle : public PaintShape
{
public:
PaintRectangle() { }
// ...
};

//  This is our (*static*) factory method
PaintShape *PaintShape::createShapeObject(std::string shape)
{
if (shape == "triangle")
return new PaintTriangle;
if (shape == "rectangle")
return new PaintRectangle;
return nullptr;
};

И тогда вы можете просто сделать (например):

std::string shape;
std::cout << "What shape would you like? ";
std::getline (std::cin, shape);
PaintShape *ps = PaintShape::createShapeObject (shape);
// ...

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы — и, пожалуйста, прочитайте комментарии о том, почему, строго говоря, createShapeObject() должен вернуть std::unique_ptr.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]