正确的初始化成员结构的方法

时间:2017-05-19 00:20:50

标签: c++ c++11 initialization c++14

我们说我有以下代码:(请注意,我无法更改Vec2的声明)

展览A

struct Vec2 {
  float x;
  float y;
};

class C {
  struct Data {
    Vec2 v1;
    Vec2 v2;
    int n = 0;
  };
  Data _data;

  C() : _data() {}
};

这似乎正确地将Data中的两个Vec2结构初始化为零值。为什么会这样? C&#39的构造函数初始化列表中的初始化是否处理了这个?

更正确的表单会使用统一的初始化语法吗?

图表B

class C {
  struct Data {
    Vec2 v1{};
    Vec2 v2{};
    int n{};
  };
  Data _data;

  C() {}
};

这导致了我的第二个问题 - 如果构造函数的构造函数没有参数,那么_data是否需要进入构造函数的初始化列表?或者编译器是否应该隐式处理初始化?我注意到,当在展览A中使用声明,但在构造函数中省略初始化列表时,在VC ++编译器上,看起来它确实如此,但是,在Clang上,似乎数据未初始化。

1 个答案:

答案 0 :(得分:0)

不确定这是否会有所帮助,但如果您要在结构中添加默认构造函数,那么您应该可以这样做:

struct Vec2 {
  float x;
  float y;
  Vec2() : x(0.0f), y(0.0f) {}
};

class C {
  struct Data {
    Vec2 v1;
    Vec2 v2;
    int n;

    Data() : v1( Vec2() ), v2( Vec2() ), n(0) {}
  };
  Data _data;

  C() : _data( Data() ) {}
};

修改

OP提到他不能修改Vec2所以间接可以做的是:

#include "Vec2"

class MyVec2 : public Vec2 {
public:
   MyVec2() : x(0), y(0) {}
};

然后,您应该能够使用您定义的Vec2版本及其构造函数。其余的代码将保持不变,但这可能会导致问题,因为基类没有自己的default constructor