成员声明顺序在类中如果彼此依赖,则为最优解

Members declaration order in a class if they depend on eachother, optimal solution

本文关键字:依赖 顺序 声明 如果 成员      更新时间:2023-10-16

如果我有一个包含更多成员的类,其中一些成员依赖于其他成员,那么声明其成员的最佳方式是什么?例如:

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的其他函数中。这个问题的最佳解决方案是什么?

由于初始化顺序取决于它们在类中定义的顺序,因此忽略成员顺序:

所以我只是将整数和字符串移动到MyOb1MyOb2之上,@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)。

—则非静态数据成员应按其初始化顺序初始化是在类定义中声明的(还是不管顺序如何)

—最后,执行构造函数体。(注意:申报顺序是强制的,以确保基地和成员子对象按与初始化相反的顺序销毁。)