C++ 在C+中实现默认值+;

C++ 在C+中实现默认值+;,c++,c++11,default-value,C++,C++11,Default Value,我有一个包含一组属性的类,我希望能够从另一个实例(名为parent)获取默认值 如果实例没有父对象,则为其指定默认值。 但是,如果实例有一个父对象,那么我希望它将其属性默认为父对象的属性,限制条件是,如果修改了父属性,那么对象属性也可以获得新值。 鉴于此限制,我不能简单地从父级复制值 因此,我认为我有两种方法: 使用指针:如果指针为nullptr,则使用父值 为每个属性使用bool字段,指示状态 这两种方法都应该有效,但它们也不方便: 第一个将需要手动实例化,即使它可以通过共享或唯一的pt

我有一个包含一组属性的类,我希望能够从另一个实例(名为parent)获取默认值

如果实例没有父对象,则为其指定默认值。 但是,如果实例有一个父对象,那么我希望它将其属性默认为父对象的属性,限制条件是,如果修改了父属性,那么对象属性也可以获得新值。 鉴于此限制,我不能简单地从父级复制值

因此,我认为我有两种方法:

  • 使用指针:如果指针为nullptr,则使用父值
  • 为每个属性使用bool字段,指示状态
这两种方法都应该有效,但它们也不方便:

  • 第一个将需要手动实例化,即使它可以通过共享或唯一的ptr简化。但这将导致附加指令,从而降低代码速度
  • 第二个将导致额外的内存消耗:每个实例将为每个属性至少多占用一个字节(大多数情况下为2、4甚至8个字节)

我的问题是:有没有其他方法来实施这种行为?或者最好的解决方案是什么?

也许可以使用以下基本构造块:可默认的引用:

#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;
};
#包括
#包括
模板
结构RefWithDefault
{
/*外部参考版本*/
RefWithDefault(T&x):r(x){}
/*默认初始化版本*/
RefWithDefault():p(新T),r(*p){
/*值/直接初始化版本*/
模板
RefWithDefault(Args&&…Args):p(新的T(std::forward(Args)…)),r(*p){
T运算符(){return r;}
私人:
std::唯一的ptr p;
T&r;
};
现在,您可以使用现有引用初始化这样的对象,或者将其保留为空,然后它将构造一个您有引用的新对象

第二个将导致额外的内存消耗:每个实例 将至少再占用一个字节(大多数情况下为2、4甚至8个字节) 每个属性


然后使用位字段或位掩码为每个属性使用单个位。没有比这更有效的了。

你的口头描述听起来有点混乱。您可以发布一些代码,您希望如何使用它,以及它的行为如何?我需要每个属性的附加字段和手动分配开销否?