Добавление декларации члена приводит к неявной инициализации?

0

У меня следующий класс

//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 - singleton, и я использую статический метод для возврата ссылки на него). Мне нужно установить "_chManager = this" перед инициализацией _entityGenerator, потому что конструктор вызовет GetChallangeManager().

Я новичок в C++ и не понимаю следующего. Когда объявление "EntityGenerator _entityGenerator" в файле заголовка не комментируется конструктором EntityGenerator, неявным, вызванным средой выполнения C++ (я вижу шаги во время отладки в VS) в списке инициализации ChallengeManager и когда комментируется - не вызывается. Не могу понять, почему... поскольку я знаю, что декларация не должна приводить к неявной инициализации в C++. Вы можете помочь?

Теги:

1 ответ

3
Лучший ответ

Это правило языка. Считается слишком опасным, чтобы объект мог получать неинициализированные пользовательские типы. Таким образом, нестатические члены данных определяемых пользователем типов всегда инициализируются так или иначе, когда экземпляр, содержащий их, создается.

Обратите внимание, что инициализация не должна быть неявной: вы можете быть явным:

struct Foo
{
  Foo() {}
  Foo(int i, int j) {}
};

struct Bar
{
  Bar() : f_(42, 42) {} // explicit initialization of data member f_
  Foo f_;
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню