我有一个包含许多实例变量的类:
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, ...);
Q
和Z
的值在构造函数中计算,作为其他值的函数。我是这样做的,因为Data
的实例意味着是不可变的,我希望字段为const
以帮助编译器强制执行此操作。
据我所知,这需要我定义一个构造函数
Data::Data(const double a, const double b, ...) : a(a), b(b), ... {}
这不是真的一个问题,但是有~35个字段,这是很多非常公式化的代码,原则上可以自动生成。有没有什么方法可以利用C ++语法或预处理器来做到这一点?具体来说,我想以某种形式给出一次一次的字段列表,并且自动生成构造函数中的声明,参数和构造函数中的初始值设定项。这样,当我必须向类中添加一个新字段时(我不时会这样做,因为我添加了新功能),我只需要记住在一个地方添加新字段。
或者放弃const
- 完全正确的想法可能会更好吗?如果我这样做,我可以使用默认构造函数创建Data data_instance()
,然后然后计算值并将它们直接分配给它的字段。这样我只需要声明变量,而不是在构造函数中初始化它们。 (如果我可以,比方说,标记为const
的字段,但以某种方式使它们仍然能够在构造函数的主体中进行修改,那对我来说很有用。)
答案 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.s
是std::string const&
的方式,因为const
分布在实例的成员中。