我有下一堂课
//ChallengeManager.h:
#include "EntityGenerator.h"
class ChallengeManager
{
public:
...
EntityGenerator _entityGenerator; /* With this declaration, constructor of the EntityGenerator will be callen in the ChallengeManager initialization list. If we will comment this out - clear that wan't be */
static ChallengeManager* _chManager;
}
//ChallengeManager.cpp:
ChallengeManager* ChallengeManager::_chManager;
ChallengeManager::ChallengeManager() : foo()
{
_chManager = this;
//EntityGenerator _entityGenerator();
}
ChallengeManager* ChallengeManager::GetChallangeManager()
{
return _chManager;
}
...
(ChallengeManager是单例,我使用静态方法返回它的引用)。我需要设置 在初始化_entityGenerator之前“_chManager = this”,因为它的构造函数将调用GetChallangeManager()。
我是C ++的新手,无法理解下一件事。当头文件中的“EntityGenerator _entityGenerator”声明没有被注释的EntityGenerator的构造函数隐式调用由c ++运行时调用(我在VS中调试时看到的步骤)在ChallengeManager初始化列表中以及何时被注释 - 未调用。无法理解为什么......因为我知道声明不应该导致C ++中的隐式初始化。你能帮忙吗?
答案 0 :(得分:3)
这是语言的规则。允许对象获取未初始化的用户定义类型被认为太危险。因此,当实例化包含它们的类型时,用户定义类型的非静态数据成员总是以这种或那种方式初始化。
请注意,初始化不必是隐式的:您可以明确它:
struct Foo
{
Foo() {}
Foo(int i, int j) {}
};
struct Bar
{
Bar() : f_(42, 42) {} // explicit initialization of data member f_
Foo f_;
};