c++ - 在 C++ 工厂中删除实例

标签 c++ inheritance factory-pattern delete-operator

我遇到了这种 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
    }
}

非常欢迎任何输入或替代方法。

最佳答案

delete(instance); 应该可以。您忘记在 MyClass 中添加虚拟析构函数:

class MyClass {
public:
    virtual ~MyClass();

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

    void SomeAction() = 0;
}

关于c++ - 在 C++ 工厂中删除实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13472456/

相关文章:

c++ - 非标准语法,使用 & 创建指向成员的指针

Java类,继承构造函数用new

python - 当您从 Python 中的模块而不是类继承时会发生什么?

c++ - 工厂设计模式问题

.net - 关于依赖注入(inject)和工厂的疑惑

c++ - 如何使用boyer_moore_search在内存中搜索char *字符串?

c++ - 不同版本的 C/C++

c++ - 如何在 linux 中将 libcurl 链接到我的 c++ 程序?

c++ - Child 的对齐小于 Base 的对齐

c++ - 如何实现工厂模式?