5

是否可以在我自己定义的默认 ctor 中调用聚合初始化?

GCC 使用以下代码抱怨“错误:构造函数委托给自身”:

struct X {
  int x, y, z, p, q, r;
  X(): x{}, y{}, z{}, p{}, q{}, r{} { }  // cumbersome
//X(): X{} { }  // the idea is nice but doesn't compile
};

memset(this, 0, sizeof(*this))目前正在 ctor 体内使用。

4

3 回答 3

1

一种方法是通过以下方式欺骗重载解决方案:

struct X {
  int x, y, z, p, q, r;
  X(int) : x{}, y{}, z{}, p{}, q{}, r{} { }
  X() : X(0) { }
};

另一种方法是使用类内默认成员初始化:

struct X {
  int x = 0, y = 0, z = 0, p = 0, q = 0, r = 0;
};

在您的具体示例中,您还可以执行以下操作:

struct X {
  std::array<int, 6> vars{};
};
于 2016-06-02T13:25:20.353 回答
0

您可以使用 CRTP 来执行此操作。

template<class C>
struct ZeroInitialized
{
    ZeroInitialized() { memset((C*)this, 0, sizeof(C)); }
};


struct A : ZeroInitialized<A>
{
    int x, y, z, p, q, r;
};

但我不保证这是安全的。

于 2016-06-02T13:42:57.010 回答
0

使用工厂模式- 将构造函数的主体移动到单独的类:

struct X {
  int x, y, z, p, q, r;
};

struct XFactory {
  X create();
};

X XFactory::create()
{
   X x{};
   // do needed modification
   return x;
}

虽然我总是更喜欢工厂模式 - 还有其他方式更符合您的明确需求 - 为每个成员数据定义默认构造函数:

template <typename T>
struct DefaultConstructibleData
{
   T data;
   DefaultConstructibleData() data{} {} 
};

并使用它:

struct X {
  DefaultConstructibleData<int> x, y, z, p, q, r;
  X() 
  {         
       // do whatever you needs to do
       // all x,y,... are already constructed to their defaults
  }
};
于 2016-06-02T14:00:50.757 回答