1

私はこの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
    }
}

任意の入力または代替アプローチは大歓迎です。

4

2 に答える 2

1

すべてのMyClassニーズは仮想デストラクタであり、残りはコンパイラ/ランタイムが行います。

于 2012-11-20T11:46:31.100 に答える
1

delete(instance);動作するはずです。MyClassに仮想デストラクタを追加するのを忘れました:

class MyClass {
public:
    virtual ~MyClass();

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

    void SomeAction() = 0;
}
于 2012-11-20T11:46:56.013 に答える