如何在声明时间内启动成员对象



这是一个类。

class Checker
{
public:
  Checker();
  ~Checker();
private:
  MapFileParser m_MapParser; //MapFileParser::MapFileParser(const char* path)
};

在声明另一个类时,是否有任何方法可以启动类成员对象?MapFileParser类只有一个conducter,其签名如MapFileParser::MapFileParser(const char* path)。但是我无法在课堂成员中初始化它。因此,我总是在Checker班级构造中初始化MapFileParser成员。

来自C 11您可以使用默认成员初始化器,例如

class Checker
{
  ...
  MapFileParser m_MapParser{"something"};
  // or
  MapFileParser m_MapParser = MapFileParser("something");
};

在C 11之前,您必须使用成员初始器列表,

成员初始化列表是可以指定这些对象的非默认初始化的地方。

,例如

class Checker
{
public:
  Checker() : m_MapParser("something") {}
  ...
private:
  MapFileParser m_MapParser;
};

您可以使用:

  1. 阶层成员初始化语法初始化成员变量(仅在C 11或更高版本中可能)。

    MapFileParser m_MapParser = MapFileParser("some sensible file name");
    
  2. 初始化列表语法以初始化成员变量。

    Checker::Checker() : m_MapParser("some sensible file name") { ... }
    

只有在您有多个构造函数的情况下,课堂成员初始化语法才有用。如果您有一个构造函数,则可以使用初始化列表语法而不会损失功能。

如果您有多个构造函数,并且可以使用C 11或更高版本的编译器,则可以使用委派构造函数来减少代码重复。


在评论中,您说:

i将把Checker()的参数void固定到const char *,Checker(const char * path)将通过MapFileParser的路径。

在这种情况下,唯一的解决方案是使用成员初始化列表来初始化成员。

Checker::Checker(char const* path) : m_MapParser(path) { ... }

最新更新