Dav*_*d Z -1 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, ...);
};
Run Code Online (Sandbox Code Playgroud)
以及代码中其他地方的一些相当复杂的逻辑,它们计算所有这些字段应该具有的值,然后创建一个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, ...);
Run Code Online (Sandbox Code Playgroud)
的值Q和Z计算在构造,作为其他值的函数.我是这样做的,因为实例Data是不可变的,我希望这些字段可以const帮助编译器强制执行此操作.
据我所知,这需要我定义一个构造函数
Data::Data(const double a, const double b, ...) : a(a), b(b), ... {}
Run Code Online (Sandbox Code Playgroud)
这不是一个真正的问题,但是有大约35个字段,这是很多非常公式化的代码,原则上可以自动生成.有没有什么方法可以利用C++语法或预处理器来做到这一点?具体来说,我想以某种形式给出字段列表一次,并且具有声明,构造函数中的参数以及构造函数中的初始化器全部自动生成.这样,当我必须向类中添加一个新字段时(我不时需要这样做,因为我添加新功能),我只需要记住在一个地方添加新字段.
或者const完全抛弃正确性的想法可能会更好吗?如果我这样做,我可以Data data_instance()使用默认构造函数创建,然后计算值并将它们直接分配给它的字段.这样我只需要声明变量,而不是在构造函数中初始化它们.(如果我可以,比方说,将字段标记为const但是以某种方式使它们仍然能够在构造函数的主体中进行修改,这对我来说很有用.)
如果这只是一个简单的数据"持有者",请考虑将其改为聚合.
struct Data { // class works equally well...
double a, b, c, d;
size_t e, f, g, h, i, j;
std::string s;
};
Run Code Online (Sandbox Code Playgroud)
现在你使用它:
Data const d { 0,1,2,3, 111,222,333,444,555,666, "hello world" };
Run Code Online (Sandbox Code Playgroud)
注意d.sa是如何的std::string const&,因为它const分布在实例的成员中.
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |