如何在声明时间初始化成员对象?
问题描述:
这是一堂课。如何在声明时间初始化成员对象?
class Checker
{
public:
Checker();
~Checker();
private:
MapFileParser m_MapParser; //MapFileParser::MapFileParser(const char* path)
};
当它声明另一个类时,是否有任何方法来初始化类成员对象? MapFileParser
类只有一个具有类似MapFileParser::MapFileParser(const char* path)
签名的构造函数。但是,当它在类成员中时,我无法初始化。所以我总是初始化Checker
类的构造函数MapFileParser
成员。
答
可以使用:
-
在级成员初始化语法来初始化一个成员变量(仅在可能的C++ 11或更高版本)。
MapFileParser m_MapParser = MapFileParser("some sensible file name");
-
用于初始化成员变量的初始化程序列表语法。
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;
};
你知道翻译过程中的路径吗?当我意识到它可能不适用时,我正在写同样的答案。 – StoryTeller
你说“翻译过程中”意味着在编译时? – HelloWorld
是的。翻译是C++标准使用的。它是实现不可知的。 – StoryTeller