2011-12-18 6 views
1

私は、既定値を別のインスタンス(parentという名前)から取得できるようにする一連の属性を含むクラスを持っています。C++で既定値を実装

インスタンスに親がない場合は、デフォルト値が割り当てられます。 インスタンスに親がある場合は、親属性の属性をデフォルトのに設定したいとします。親属性を変更すると、オブジェクト属性も新しい値を取得することができます。 この制限があると、私は単に親から値をコピーすることはできません。

  • 使用ポインター:

    したがって、私は、私は二つの方法があると思うのポインタは、親の値を使用しnullptrある場合。

  • 各属性にboolフィールドを使用して、ステータスを示します。

どちらの方法でも動作するはずですが、彼らはまた、incovenientています

  • は、最初はそれがshared_ptrのかunique_ptrをして簡略化することができた場合でも、手動のインスタンスが必要になります。しかし、これにより追加の命令が発生し、コードが遅くなります。
  • 2つ目は追加のメモリ消費につながります。各インスタンスは、属性ごとに少なくとも1バイト(ほとんどの場合、2,4または8バイト)を要します。

私の質問は:このような動作を実装する他の方法はありますか?または、最善の解決策は何ですか?

+1

あなたの言葉の説明がちょっと乱雑に聞こえます。あなたはこれをどのように使用したいと思いますか、それをどのように動作させたいのか、いくつかのコードを投稿できますか? –

答えて

2

第二は、追加のメモリ消費につながる各インスタンス は、少なくとも一つ以上のバイトを取る属性ごと (時刻2、4又は更に8バイトのほとんど)。

ビットフィールドまたはビットマスクを使用して、各属性に1つのビットを使用します。それ以上の効率はありません。

1

たぶん、次の基本的なビルディングブロックを使用することができます:デフォルト値を設定参照:

#include <memory> 
#include <utility> 

template <typename T> 
struct RefWithDefault 
{ 
    /* external reference version */ 
    RefWithDefault(T & x) : r(x) { } 

    /* default-initialize version */ 
    RefWithDefault() : p(new T), r(*p) { } 

    /* value/direct-initialize version */ 
    template <typename ...Args> 
    RefWithDefault(Args &&... args) : p(new T(std::forward<Args>(args)...)), r(*p) { } 

    T & operator() { return r; } 

private: 
    std::unique_ptr<T> p; 
    T & r; 
}; 

今、あなたはどちらか既存参照して、このようなオブジェクトを初期化することができ、または空白のままにして、新しいオブジェクトを構築しますがそこにはあなたがリファレンスを持っています。

+0

各属性の追加フィールドと手動の割り当てオーバーヘッドの両方が必要になりますか? – Geoffroy