【问题标题】:create members automatically if they are used in construction如果在施工中使用,则自动创建成员
【发布时间】:2012-07-20 21:44:39
【问题描述】:

假设我有一个用doubless 填充的结构(或我仅用于存储的类)。我创建了一个构造函数来分配给那些doubless:

struct Point {
  double time;
  double x;
  double y;
  Point(double a_time, double a_x, double a_y)
    : time(a_time), x(a_x), y(a_y) {}
}

如果已经在构造函数中声明了成员,那么在类中声明成员似乎是多余的。 有没有办法减少这些冗余,以便构造函数中使用的成员自动成为类的公共成员?也可能对其他成员函数有用。

此示例类似于Programming: Principles and Practice Using C++ 第 348 页上的示例。所以这是当代既定的编码风格。 此外,我正在寻找一种现代 C++ 风格的解决方案,这意味着没有预处理器。

更新(1) 该结构体需要按以下方式使用:

vector<Point> points
points.push_back(t0,x0,y0)

【问题讨论】:

  • 在某些情况下你可以反过来做:www2.research.att.com/~bs/C++0xFAQ.html#member-init
  • 当类有多个构造函数时,你有什么建议?
  • 为什么要将构造函数中使用的类的所有成员声明为public?
  • @AdityaKumar,很高兴知道,谢谢。我的评论对这个例子没有帮助,但它很可能是你能得到的最好的。
  • @kirill_igum,如果你有 C++11,你可以考虑使用emplace_back 在后面就地构造元素。

标签: c++ templates generics boost metaprogramming


【解决方案1】:

你拥有它的方式非常好。但是,如果您只想提供默认值,在 C++11 中您可以直接初始化您的成员,并且不需要构造函数:

struct Point {
  double time = 0.0;
  double x = 0.0;
  double y = 0.0;
};

另外,看起来这个结构只是一个数据包,如果是这样的话,你也可以使用聚合初始化,它在没有 C++11 的情况下也可以工作:

示例 1

struct Point {
  double time;
  double x;
  double y;
} p = {0.0, 0.0, 0.0};

示例 2

struct Point {
  double time;
  double x;
  double y;
};

Point p1 = {0.0, 0.0, 0.0};

更新后

您可以像这样将push_back 与平面数据类型一起使用:

v.push_back({t0, x0, y0});

【讨论】:

  • @kirill_igum:我会删除构造函数并使用push_back,就像在我的示例中一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多