наследование — удаление экземпляров в C ++ Factory

Я наткнулся на этот шаблон фабрики C ++, и мне нравится, как право собственности принадлежит потребителю:

class MyClass {
public:
void Create(MyClass **instance, int some_param);
void Destroy(MyClass *instance);

void SomeAction() = 0;
}

// Use it

MyClass *instance;

MyClass::Create(&instance, 5);
instance->SomeAction();
MyClass::Destroy(instance);

Но как вы реализуете Destroy? я представляю себе Create будет выглядеть примерно так:

void MyClass::Create(MyClass **instance, int some_param) {
// Subtype in some way derived from some_param
if (some_param == 1) {
*instance = (MyClass *) new MyClassSubClass();
}
// if some_param == 2, use MyDifferentSubClass() etc...
}

Я пробовал что-то вроде следующего для Destroy, но не могу заставить его работать:

void MyClass::Destroy(MyClass *instance) {
delete instance;
}

Может быть delete нужно знать конкретный подкласс (чтобы узнать размер его выделения)? Но это тоже не работает:

void MyClass::Destroy(MyClass *instance) {
if (some_param == 1) {
delete (MyClassSubClass *)instance
}
}

Любой вклад или альтернативные подходы очень приветствуются.

1

Решение

delete(instance); должно сработать. Вы забыли добавить виртуальный деструктор в MyClass:

class MyClass {
public:
virtual ~MyClass();

void Create(MyClass **instance, int some_param);
void Destroy(MyClass *instance);

void SomeAction() = 0;
}
1

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

Все MyClass needs — это виртуальный деструктор, а остальное сделает компилятор / среда выполнения.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector