2009-03-25 13 views
0

ここにシナリオがあります: バッファのサイズは、派生したクラスによって異なりますが、すべての派生クラスに対して一度バッファを割り当てる基本クラスを定義します。私はこの方法でそれを達成できる:派生クラスのctorが実行されるまで、C++基本クラスのメンバの初期化を遅延させる方法はありますか?

class derived 
{ 
public: 
    derived(size_t array_size):size(array_size) 
    { 
      p_array.reset(new unsigned char[size]); 
    }  
}; 

しかし、派生クラスの設計を簡素化するために、私は本当にこの行を入れたい:派生クラスで

class base 
{ 
public: 
    base():size(), p_array(0){} 
private: 
    size_t size; 
    boost::shared_array<unsigned char> p_array; 

}; 

p_array.reset(new unsigned char[size]); 

をベースクラスのどこかに書き込むことで、一度だけ書き込みます。 C + +のデザインパターンはそれを達成することができますか?おかげさまで

答えて

4

申し訳ありませんが、なぜ2つのアレイ(および2つのサイズ)がありますか?今度は、派生クラスを作成する場合、p_arrayの2倍です。私はコンパイラがこれに誤りを与えるべきだと思います。

あなたはこれをしたくありませんか?

class base 
{ 
public: 
    base():size(), p_array(0){} 
    base(size_t array_size):size(array_size) 
    { 
      p_array.reset(new unsigned char[size]); 
    } 
private: 
    size_t size; 
    boost::shared_ptr<unsigned char> p_array; 

}; 

class derived 
{ 
public: 
    derived(size_t array_size):base(array_size) 
    { 
    } 
private: 
}; 
+0

あなたはそうです、基本クラスの行をコピーし、派生クラスのドラフト中に変更しました。修正しました、ありがとうございます。 –

+0

あなたのコードには私の質問で避けたいと思う非常に問題があります。 p_arrayは、派生クラスの値をメンバのサイズに再割り当てしたときにすでに割り当てられています。この時点から、メンバのサイズは割り当てられたバッファのサイズと同じになりません。 –

+0

ベクターを使用できますか?この問題は解決しやすくなります – RvdK

3

あなたは、基本クラスのコンストラクタにサイズを渡すことができます:それは基地建設時に、それを知っている必要があるものの

class base 
{ 
    base(size_):size(size_), p_array(new char[size_]) {} 
} 

あなたの派生クラスは、サイズを決定します。

class largebufferderived : public base 
{ 
    public: 
    largebufferderived() : base(77220) {} 
} 

必要に応じてバッファを初期化することができます(マルチスレッドのシナリオでは必ずしも良いとは限りません):

boost::shared_ptr<char> Buffer() 
{ 
    if (!p_Array) 
    p_array.reset(new unsigned char[size]); 
} 

p_Arrayを基本クラスにprivateにすると、派生クラスはBuffer()を通じてのみアクセスできます。


また、「FinalConstruct」メソッドを追加して、派生クラスのコンストラクタを呼び出すこともできます。 Thiはそれを呼び出すことを避けませんが、少なくともすべてのコンストラクターが呼び出された後に実行する必要があるものを分離します。

btw。なぜshared_ptrではなく、shared_arrayですか?

+0

はい私は入力している間boost :: shared_arrayを考えていました。今修正されました。 あなたが提案した方法はまさに私が避けたかったものです。私はこれを達成したかった: 1)バッファは基底クラスの内側に割り当てられているが、 2)サイズは派生クラス内で指定されている。 –

+0

派生クラスでp_arrayをリセットすることで、クラスはうまくいきませんでした。なぜなら、1)バッファオーバーフローを引き起こしてバッファオーバーフローが発生することを忘れる可能性があるからです。2)バッファが理論上2回第1のものは浪費される。 –

+0

どちらの場合も、p_arrayのリセットは基本クラスで行われ、サイズは派生クラス内で決定されます。最初の例では、引数に依存する算術演算を行うことができ、静的関数を呼び出してサイズを決定することもできます。 – peterchen

関連する問題