В принципе, как это работает, так:
- Если класс Child полностью определен до класса Owner , его можно включить в Owner полностью или в виде указателя, в зависимости от того, что вы предпочитаете.
- Если класс Child не определен полностью до класса Owner , он должен быть объявлен вперед и может быть включен только в качестве указателя. Это должно быть выделено в куче с
new
.
Если вы включите класс целиком, он будет создан одновременно с созданием объекта-владельца. Если явно не указано иное, для этого компилятор будет использовать конструктор по умолчанию.
Вариант 1:
// will create a Child object using the default constructor.
// this is done even before doStuff() is called.
Owner::Owner(const char childName[]) {
doStuff();
}
Вариант 2:
// will create a Child object using the Child(const char*) constructor.
// again, done before doStuff() is called.
Owner::Owner(const char childName[]): _myChild(childName) {
doStuff()
}
Вы не можете использовать синтаксис _myChild(childName);
внутри самого конструктора, поскольку _myChild уже создан до того, как он достигнет такого уровня. Child _myChild(childName);
допустимо, но создает новый локальный объект с именем _myChild вместо изменения члена класса _myChild . Вероятно, это не ожидаемый результат.
Если вы хотите присвоить новое значение _myChild после его создания, выполните одно из следующих действий:
- Предпочтительный метод : каким-либо образом изменить существующий объект (например, перегрузить оператор присваивания, чтобы вы могли выполнить
_myChild = childName;
, или использовать некоторую форму функции _myChild.setName(childName);
).
- Альтернативный метод : Используйте
_myChild = Child(childName);
, чтобы создать новый Дочерний и назначить его переменной-члену.
Этот второй вариант, хотя и функционален, неэффективен, поскольку требует создания объекта дважды без веской причины.