成员声明顺序在类中如果彼此依赖,则为最优解
Members declaration order in a class if they depend on eachother, optimal solution
如果我有一个包含更多成员的类,其中一些成员依赖于其他成员,那么声明其成员的最佳方式是什么?例如:
class MyClass
{
private:
MyOb1 Obj1;
MyOb2 Obj2;
int i;
std::string str;
public:
MyClass(int iIn, const std::string& strIn)
: i(iIn), // here
str(strIn),
Obj1(i),
Obj2(i, str) {}
}
由于声明顺序的原因,出现了一些问题。我选择这个顺序是因为它是最优的顺序。我需要这些值在MyClass
的其他函数中。这个问题的最佳解决方案是什么?
由于初始化顺序取决于它们在类中定义的顺序,因此忽略成员顺序:
所以我只是将整数和字符串移动到MyOb1
和MyOb2
之上,@Matt McNabb也指出,你应该在MyOb1/2对象的初始化中使用构造函数中传递的参数,以避免歧义(一个明智的建议):
class MyClass
{
private:
int i;
std::string str;
MyOb1 Obj1;
MyOb2 Obj2;
public:
MyClass(int iIn, const std::string& strIn)
: i(iIn), // here
str(strIn),
Obj1(iIn),
Obj2(iIn, strIn) {}
}
引自标准第12.6.2节(最新的草案在第266页):
初始化应按以下顺序进行:-首先,并且仅用于最派生类as的构造函数类中初始化虚基类的从左到右遍历中出现的顺序为深度优先基类的有向无环图,其中"从左到右"是基类名称在派生类中的出现顺序base-specifier-list .
-那么,直接基类应按声明顺序初始化当它们出现在基本指定符列表中时(无论它们的顺序如何)mem-initializers)。
—则非静态数据成员应按其初始化顺序初始化是在类定义中声明的(还是不管顺序如何)
—最后,执行构造函数体。(注意:申报顺序是强制的,以确保基地和成员子对象按与初始化相反的顺序销毁。)
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- OpenMP 4.5 任务依赖关系和执行顺序
- 如何强制依赖静态对象(包括模板成员)的初始化顺序
- 当C++模板类中存在循环依赖关系时,修复包含顺序
- 此代码是否依赖于函数调用顺序未定义的行为
- 如何在不放置任何物理依赖项的情况下指定生成文件目标生成顺序
- 提升单元测试框架依赖项的执行顺序
- 生成文件未按正确的顺序注册依赖项
- 在c++中,当组合对象构造函数有依赖关系时,如何在初始化列表中强制它们的顺序
- 成员声明顺序在类中如果彼此依赖,则为最优解
- 文件间依赖变量的初始化顺序是什么?
- 依赖于初始化的顺序
- 项目依赖顺序- VS2013
- c++ -构建顺序和依赖问题
- 在c++中,依赖局部对象以相反的构造顺序被析构是不是一种不好的做法?
- 我如何使Stata插件不依赖于变量的顺序
- 构造函数执行顺序/顺序:函数中静态变量(类实例)的依赖初始化
- 是否有任何标准的包含顺序来避免隐藏的依赖关系