Шаблон метода фабрики C ++ для абстрактного класса - PullRequest
0 голосов
/ 09 июня 2011

Я должен реализовать шаблон метода фабрики в C ++. Класс (C), который должен быть «собран» фабрикой, является абстрактным и наследуется другим классом (D). Поэтому я не хочу, чтобы у C был конструктор. Но чтобы создать экземпляр D, C должен иметь хотя бы защищенный конструктор. Но тогда кто-то может извлечь из C и создать экземпляр C таким образом. Я не хочу, чтобы это случилось. Поэтому я создал защищенный конструктор, который берет указатель на объект C для использования производными классами, код приведен ниже. Вопрос в том, является ли это правильным способом решения этой проблемы.

class C {
private:
 C() {}
protected:
 C(const C* c) {}
friend class CFactory
};

class D: public C
{
private:
 D(const C* c): C(c) {}
friend class CFactory;
};

class CFactory
{
public:
 static C* createC() {
  C* ptr = new C();
  ptr = new D(ptr); // There is garbage collection on the project, so no memory leak.
 }
};

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Вероятно, это лучший вариант дать C частный конструктор и сделать D классом-другом C.

0 голосов
/ 09 июня 2011

Есть ли причина, по которой вы делаете объект C для копирования на фабрике?

Если вместо:

C* ptr = new C();
ptr = new D(ptr);

вы сделали D другом для C, сделали конструктор по умолчаниюдля D и на заводе было только:

ptr = new D();

Это упростило бы вещи.

...