Как избежать необходимости инициализации объекта-члена в списке инициализации? - PullRequest
0 голосов
/ 30 декабря 2018

Я пишу приложение на C ++, которое использует множество дочерних объектов, вложенных в один «корневой» объект.

Каждый из них должен быть инициализирован в определенном порядке с выполнением различных операций между каждой инициализацией, а иногда и необходимостью предварительно инициализировать их в качестве аргументов друг другу.

Однако мой компилятор заставляет меня инициализировать их в списке инициализатора конструктора, настаивая на инициализации в пределах конструктора недостаточно.Например, я не мог сделать следующее:

SomeThing::SomeThing() {
    int argGottenByLibraryCall;
    someLibraryCallToGetArg(&argGottenByLibraryCall);
    m_ChildObject = ChildClass(argGottenByLibraryCall);
}

Я взялся за реализацию функции инициализатора после создания:

SomeThing::SomeThing() : m_ChildObject() {
    int argGottenByLibraryCall;
    someLibraryCallToGetArg(&argGottenByLibraryCall);
    m_ChildObject.Initialize(argGottenByLibraryCall);
}

Это, однако, кажется плохой практикойдля меня, чтобы следовать.Есть ли лучший способ заставить мой компилятор (VC ++ 2017) принимать инициализацию в теле конструктора?

1 Ответ

0 голосов
/ 30 декабря 2018

Это, однако, кажется мне плохой практикой.

Плохая практика - не использовать списки инициализации .Они позволяют вам пометить элементы данных как const, а также обеспечить их инициализацию.

Правильный способ решения вашей проблемы - это реструктурировать код, чтобы в m_ChildObject был правильный конструктор, который можноиспользуется в списке инициализации члена.

Если это невозможно, оберните свою логику инициализации в функцию и используйте ее в списке инициализации члена:

ChildObjectType makeChildObject() {
    int argGottenByLibraryCall;
    someLibraryCallToGetArg(&argGottenByLibraryCall);

    ChildObjectType result;
    result.Initialize(argGottenByLibraryCall);
    return result;
}

// ...

SomeThing::SomeThing() : m_ChildObject(makeChildObject()) { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...