0

基本クラスを破棄して、このトリックで派生して再作成できますか?

class base: noncopyable
{
    base();         //ctor with none param
    base(int x);    //ctor with one param
    base(int x, int y); //ctor with two param

    virtual ~base();
}

struct params
{
    int x;
    int y;
    enum 
    {
        typeNoneParam,  //neither x nor y is defined
        typeOneParam,   //only x is defined
        typeTwoParam    //x and y both are defined
    }typeParam;
}

class Derived
{
    Derived(params p);  //construct base class conditionally by p.typeParam
}

Derived::Derived(params p)
    :base() //default typeNoneParam
{
    //typeNoneParam need not do special process

    if (p.typeParam == params::typeOneParam)
    {
        base::~base();  //delete the default-typeNoneParam creation by base-dtor
        base(p.x);      //recreate the new base with one-param base-ctor
    }
    if (p.typeParam == params::typeOneParam)
    {
        base::~base();  //delete the default-typeNoneParam creation by base-dtor
        base(p.x, p.y); //recreate the new base with two-param base-ctor
    }
}

クラス派生およびベースのすべての宣言は変更できません。structparamsも変更できません。

派生クラスの実装のみが変更可能です-許可されています。

誰かがその実装が正しいかについてアイデアを与えることができますか?そして、他のより穏やかな実装は、このシナリオ(動的に選択するbase-ctorを使用したコピー不可能な基本クラスの初期化)を十分に満たしますか?

4

2 に答える 2

1

この場合、派生クラスに静的ファクトリ関数を追加します(オプションでコンストラクターを保護します)。そこにスイッチを入れてtypeParam、正しいコンストラクターでオブジェクトを作成できます。派生クラスには、列挙型エントリごとに1つずつ、合計3つのコンストラクターが必要です。

これにより、ハッキングなしで適切な動作が得られます。

于 2012-08-07T16:16:00.000 に答える
0

Derivedクラスコンストラクターは、最初に構築される有効なBaseクラスオブジェクトに依存します。Baseクラスを破棄することで、未定義動作でいちゃつくことになります。これは、たとえば仮想関数で明らかになる場合があります。

これを行う適切な方法は、Derivedクラスが初期化リストの一部としてパラメーターをBaseクラスコンストラクターに渡すことです。

Derived(params p) : base(p) {};
于 2012-08-07T02:55:42.857 に答える