2011-12-18 73 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