如何在列表初始化中放置额外的语句?

How do I put extra-statements in list-initialization?

本文关键字:语句 列表 初始化      更新时间:2023-10-16

假设我有一个带有构造函数的类,如下所示:

MClass(const char *t_source);

事实上,有很多地方可以从文件中获取t_source,所以我正在考虑制作另一个构造函数,它采用指针代替FILE并将大部分样板放在其中。同时,现有的构造函数本身也有很多用途,并且包含我不想在代码中重复多次的逻辑。我正在考虑委派构造函数,但看不到如何利用此功能的任何方法,因为我需要多个语句来从FILE实例中提取数据(例如分配 char 数组并从FILE读取并随后删除(。所以本质上我想做这样的事情:

MClass(FILE *t_file) : MClass(MNameSpace::readFile(t_file)) {}

但有一些初步和呼叫后的行动。知道吗?

我发现命名构造函数习惯用法可以更好地解决您的情况。与其试图将复杂性归类到构造函数上下文提供的有限空间中,不如简单地添加一个新的命名函数。

class MClass {
// ...
public:
static MClass fromFile(FILE *t_file);
};
MClass MClass::fromFile(FILE *t_file) {
// Preparation
MClass retVal(...);
// Post actions
return retVal;
}

简单,易于理解,并做你想做的事。当人们看到时,它也很好地传达了含义

MClass obj = MClass::fromFile(...);

为了启动,命名返回值优化(标准化(将避免使用命名函数的任何额外副本。最终结果将是单个构造函数调用来直接初始化obj