C ++でデフォルト値を実装する

私は、デフォルト値を別のインスタンス(parentという名前)から取得できるようにしたい、一連の属性を含むクラスを持っています。

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

したがって私は2つの方法があると思います:

  • ポインタを使用:ポインタがnullptrの場合は、親の値を使用します。
  • 属性ごとにboolフィールドを使用して、ステータスを示します。

どちらの方法もうまくいくはずですが、それらも不自然です。

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

My question is: Is there any other way to implement such behavior? Or what is the best solution?

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

2 答え

2回目になるとメモリ消費量が増えます:それぞれのインスタンス   少なくとも1バイト以上(2、4、または8バイトの大部分の時間)   属性ごとに。

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

2
追加された

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

#include 
#include 

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

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

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

    T & operator() { return r; }

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

このようなオブジェクトを既存の参照で初期化するか、空白のままにしておくと、参照を持つ新しいオブジェクトが作成されます。

1
追加された
私は各属性のための追加のフィールドと手動の割り当てオーバーヘッドの両方を必要としますか?
追加された 著者 Geoffroy,