2012-02-26 17 views
1

おそらく私は何も心配していません。私はデータメンバーがRAIIのイディオムに密接に従うことを望んでいます。抽象基本クラスの保護されたポインタメンバーをnullに初期化するにはどうすればよいですか?抽象基本クラスの保護されたメンバーをどのように初期化しますか?

私はそれがnullであるべきであることは知っていますが、それが普遍的に理解されていることを保証するのはより良いでしょうか?

初期化コードを初期化子リストの外に置くことは、実行されない可能性があります。このポインターをスタックに割り当てるアセンブリ操作について考えると、マルチスレッド環境では(c'tor本体と同じように)中断されたり、スタック拡張がアトムであることが保証されませんでしたか?デストラクタを実行することが保証されている場合、プロセッサがアトミックに実行しなくても、スタック拡張でそのような保証はないかもしれませんか?

このような簡単な質問はどのようにして広範になりましたか?ありがとう。

私がstd :: libraryを避けることができれば、私はミニマル環境にいます。

答えて

3

おそらく、あなたはこれを過剰考えている中で、それを削除することです。

struct Base 
{ 
    virtual ~Base() = 0; // or make something else pure; this is just an example 

    Base() : p() { }   // p initialized to null 
    Base(Foo * q) : p(q) { } // another option 

protected: 
    Foo * p; 
}; 

struct Derived : private Base 
{ 
    // no extra work needed 

    // maybe something like this... 
    Derived(int a, bool c) : Base(new Foo(a * (c ? 2 : 3))) { } 
}; 

派生コンストラクターが基本コンストラクタ最初の事を呼び出し、順番に1つは、Base::pがゼロに初期化されることを述べている:次の例では、nullにintializedベース部材を有します。

+0

よく考えて、lol ++ – John

+0

あまりにも多くの 'if(p)delete p;'ウィザードがおそらくコードを生成していますか? – John

+0

@ジョン:私はもう少し重要ではない事例を追加しました。 'delete'は' Base ::〜Base(){delete p;}}のようにベースのデストラクタになければなりません。 } '。 (確かに、 'もし'を言うことはありません。) –

3

非常に簡単に:スマートポインタを使用するのが最も良い方法ですが、実際には一般的な実装よりも一般的に標準を回避しないでください。今、この場合、ポインタが(多くの場合、素晴らしいデザインではありません)子によって使用されていない限り

class base{ 
public: 
    base() : a(new int(5)) {} 
protected: 
    std::unique_ptr<int> a; 
    virtual ~base() {} 
}; 

class child : public base { 
    child() : base() {} 
    ~child() {} //a will automatically be deleted 
}; 

は、それが民間行うことができます。

もう一つの方法は、手動で、ベースデストラクタ

class base{ 
public: 
    base() : a(new int(5)) { } //base member init'd 
protected: 
    int* a; 
    virtual ~base() { delete a; } //base member destroyed 
}; 
+0

他のアイデアはありますか?私はstd :: libraryを利用できません。私は、私の抽象基本クラスにc'torを持つことができないと考えていませんでした。 – John

+0

はい下のアイデアは、抽象クラスはコンストラクタとデストラクタを持つことができます。あなたの問題を解決します。興味のないのはどうしてあなたはstdライブラリを持っていないのですか、どのターゲット/コンパイラですか? – 111111

+0

@ John:ちょっと不思議なことに、組み込みシステム用のコードを書いていますか?なぜ環境は最小ですか? –

関連する問題