c++ - 在构造函数中成员初始化之前做必要的工作

标签 c++ constructor

我有一个关于 C++ 中的类及其构造函数的设计问题。我有几年的 Java 经验。在 Java 中,我会做这样的事情:我有一个类来管理 SQLite 数据库作为存储后端。在此类的构造函数中,我会将应用程序数据目录的路径作为参数传递。然后,我会查找数据库文件,建立连接,例如加载表的最新条目以进行缓存。

我现在的问题是如何在 C++ 中执行此操作。我这里的主要问题是,当执行到构造函数的第一条语句时,所有类成员都已经被初始化,无论是隐式的还是显式的。

我现在的问题是:如果在使用构造函数参数初始化类成员之前我需要对构造函数参数进行一些计算,我将如何在 C++ 中进行计算?

我已经发现我可以简单地在构造函数中使用对成员的赋值,但我也读到你不应该这样做,因为这意味着成员首先用它们的默认构造函数初始化,然后再次初始化。

在初始化类成员之前需要进行一些计算(例如加载和解析配置文件)时,规范的方法是什么?我更愿意简单地提供构造函数的路径,然后使用构造函数中的加载值加载和解析成员初始化。

最佳答案

将计算部分放在单独的函数中:

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。您还可以使用静态成员函数(如果它是私有(private)的)或其中一个参数的成员函数。

关于c++ - 在构造函数中成员初始化之前做必要的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27299344/

相关文章:

C++ 将 RAII 与多态性和堆栈分配结合使用

C++ 2011 : good syntax to initialize an array in a constructor?

java - 没有参数和默认构造函数混淆

c++ - 来自std::pair rvalues构造函数的垃圾值

spring - Spring注入(inject)中是否需要默认构造函数?

c++ - 继承构造函数和大括号或等于初始值设定项

c++ - STL 中的否定适配器

c++ - 从 weak_ptr 列表中删除项目

c++ - 哪些消息可以传递给低级鼠标钩子(Hook)回调函数?

c++ - make_pair(字符串,类): error: expected primary-expression before â)â token