我可以只使用声明生成一个简单的构造函数吗?

时间:2014-12-12 14:04:17

标签: c++ constructor instance-variables c-preprocessor

我有一个包含许多实例变量的类:

class Data {
public:
    const double a, b, c, d;
    const size_t e, f, g, h, i, j;
    const std::string s;
    // and so on
    double Q, Z;
    Data(const double a, const double b, ...);
};

以及代码中其他地方的一些相当复杂的逻辑,它们计算所有这些字段应该具有的值,然后创建一个Data对象。

double a = ...;
double b = ...;
// and so on, but not for Q and Z
Data data_instance(a, b, c, d, e, f, g, h, i, j, s, ...);

QZ的值在构造函数中计算,作为其他值的函数。我是这样做的,因为Data的实例意味着是不可变的,我希望字段为const以帮助编译器强制执行此操作。

据我所知,这需要我定义一个构造函数

Data::Data(const double a, const double b, ...) : a(a), b(b), ... {}

这不是真的一个问题,但是有~35个字段,这是很多非常公式化的代码,原则上可以自动生成。有没有什么方法可以利用C ++语法或预处理器来做到这一点?具体来说,我想以某种形式给出一次一次的字段列表,并且自动生成构造函数中的声明,参数和构造函数中的初始值设定项。这样,当我必须向类中添加一个新字段时(我不时会这样做,因为我添加了新功能),我只需要记住在一个地方添加新字段。

或者放弃const - 完全正确的想法可能会更好吗?如果我这样做,我可以使用默认构造函数创建Data data_instance(),然后然后计算值并将它们直接分配给它的字段。这样我只需要声明变量,而不是在构造函数中初始化它们。 (如果我可以,比方说,标记为const的字段,但以某种方式使它们仍然能够在构造函数的主体中进行修改,那对我来说很有用。)

1 个答案:

答案 0 :(得分:5)

如果这只是一个简单的数据"持有者",请考虑将其改为聚合。

struct Data { // class works equally well...
    double a, b, c, d;
    size_t e, f, g, h, i, j;
    std::string s;
};

现在你使用它:

Data const d { 0,1,2,3, 111,222,333,444,555,666, "hello world" };

请注意d.sstd::string const&的方式,因为const分布在实例的成员中。