如何在声明时间初始化成员对象?

如何在声明时间初始化成员对象?

问题描述:

这是一堂课。如何在声明时间初始化成员对象?

class Checker 
{ 
public: 
    Checker(); 
    ~Checker(); 

private: 
    MapFileParser m_MapParser; //MapFileParser::MapFileParser(const char* path) 

}; 

当它声明另一个类时,是否有任何方法来初始化类成员对象? MapFileParser类只有一个具有类似MapFileParser::MapFileParser(const char* path)签名的构造函数。但是,当它在类成员中时,我无法初始化。所以我总是初始化Checker类的构造函数MapFileParser成员。

+0

你知道翻译过程中的路径吗?当我意识到它可能不适用时,我正在写同样的答案。 – StoryTeller

+0

你说“翻译过程中”意味着在编译时? – HelloWorld

+0

是的。翻译是C++标准使用的。它是实现不可知的。 – StoryTeller

可以使用:

  1. 在级成员初始化语法来初始化一个成员变量(仅在可能的C++ 11或更高版本)。

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

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

中类成员初始化语法是有帮助的前提是你有一个以上的构造函数。如果您有一个构造函数,则可以使用初始化程序列表语法而不会丢失功能。

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


在评论,你说:

我会解决的检查器()的参数无效为const char *和检查(为const char *路径)将通过路径MapFileParser 。

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

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

从C++ 11开始,您可以使用default member initializer,例如,

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

C++ 11之前,你必须使用member initializer list

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

例如,

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

谢谢,但在11之前呢? – HelloWorld

+0

@HelloWorld - 你运气不好 – StoryTeller

+0

@HelloWorld回复修改。 – songyuanyao