我在C ++中遇到了关于类及其构造函数的设计问题。我来自几年的Java经验。在Java中,我会做这样的事情:我有一个类来管理SQLite DB作为存储后端。在这个类的构造函数中,我将把应用程序数据目录的路径作为参数移交给我。然后,我会查找数据库文件,实例化连接,例如加载表的最新条目以进行缓存。
我现在的问题是如何在C ++中执行此操作。我的主要问题是,当执行到达构造函数的第一个语句时,所有类成员都已经被隐式或显式初始化。
我现在的问题是:如果我在使用构造函数初始化类成员之前对构造函数参数进行了一些计算,那么我将如何在C ++中执行此操作?
我已经发现我可以简单地使用赋值给构造函数中的成员,但我也读过你不应该这样做,因为这意味着成员首先用它们的默认构造函数初始化,然后再次初始化。
在初始化类成员之前,如果要进行一些计算(例如加载和解析配置文件),那么规范的方法是什么?我更愿意简单地给出构造函数的路径,然后使用构造函数中的加载值来加载和解析成员初始化。
答案 0 :(得分:6)
将计算部分放在单独的函数中:
class C {
std::string x;
int y;
C(int xarg, int yarg);
};
std::string computeX(int xarg, int yarg) {
...
return result;
}
C::C(int xarg, int yarg) : x(computeX(xarg, yarg)), y(yarg) {}
作为“初始化”函数,您可以使用全局函数,在源文件中本地定义的函数(例如,在未命名的命名空间中),或者甚至调用在适当位置定义的lambda。您还可以使用静态成员函数 - 如果它是私有的 - 或者是其中一个参数的成员函数。