初始化基类,即POD结构

时间:2014-03-07 15:18:02

标签: c++ inheritance c++11 constructor

由于一些遗留的C代码,我有以下POD struct定义2D坐标;以及从中继承的C ++ class以提供各种操作:

struct coord
{
  double x;
  double y;
};

class CoordClass : public coord
{
  // Contains functions like...
  const CoordClass& operator+=(const CoordClass& rhs)
  {
    x += rhs.x;
    y += rhs.y;
    return *this;
  }

  double Magnitude() const { return std::sqrt(x*x + y*y); }
};

目前,CoordClass定义了一个构造函数:

CoordClass(double xx, double yy) { x = xx; y = yy; }

鉴于xy是POD基础struct coord的成员,是否可以将该构造函数编写为初始化列表和空体?考虑C ++ 03和C ++ 11的答案让我感兴趣。

3 个答案:

答案 0 :(得分:3)

在C ++ 11中,您可以提供以下构造函数:

 CoordClass(double x, double y) : coord{x, y} {}

在C ++ 03中也可以获得一个空的构造函数体,但我认为不值得这样做:

CoordClass(double x, double y) : coord(make_coord(x, y)) {}

其中make_coord是:

coord make_coord(double x, double y) {
    coord c = { x, y };
    return c;
}

它可以是private static的{​​{1}}方法。或者,它可以是CoordClass的自由函数和/或static的匿名名称空间的成员。

答案 1 :(得分:1)

在C ++ 11中,如果为结构定义默认的默认构造函数,它仍然可以是C ++ 11中的POD。 (见Is this struct POD in C++11?

struct coord
{
  double x;
  double y;

  coord() = default;
  coord(double xx, double yy) : x(xx), y(yy) {}
};

现在CoordClass构造函数变得简单了:

CoordClass(double x, double y) : coord(x, y) {}

答案 2 :(得分:0)

尝试以下

CoordClass(double xx, double yy) : coord { xx, yy } {}