2011-12-18 49 views
1

我有一個包含一組屬性的類,我希望能夠從另一個實例(名爲parent)獲取默認值。在C++中實現默認值

如果該實例沒有父級,則會爲其分配默認值。 但是,如果實例有一個父項,那麼我希望它將其屬性默認爲父項的,限制爲,如果父屬性被修改,則對象屬性也可以獲得新值。 鑑於此限制,我不能簡單地複製父項的值。

因此,我認爲我有兩種方法:

  • 使用指針:如果指針是nullptr然後使用父值。
  • 對每個屬性使用bool字段,指示狀態。

這兩種方法應該可行,但他們也incovenient:

  • 第一需要,即使它可以用shared_ptr的或的unique_ptr簡化手動實例化。但是這會導致額外的指令,因此速度較慢的代碼會導致額外的內存消耗:每個實例每個屬性至少需要多一個字節(大部分時間爲2,4或甚至8個字節)。

我的問題是:有沒有其他的方法來實現這樣的行爲?或者什麼是最好的解決方案?

+1

你的口頭描述聽起來有點亂。你可以發表一些代碼,你想如何使用它,以及你希望它如何表現? – 2011-12-18 23:24:40

回答

2

第二會導致額外的內存消耗:每個實例 將採取至少一個更多字節(大多數時間2,4或甚至8個字節) 每個屬性。

然後使用位域或位掩碼爲每個屬性使用一個位。沒有比這更有效的了。

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 2011-12-18 23:50:55