У меня есть два класса: OuterClass и InnerClass. InnerClass является частным членом OuterClass и должен быть создан в конструкторе OuterClass с конструктором InnerClass (int), однако по умолчанию конструктор InnerClass по-прежнему вызывается.Объект InnerClass, являющийся членом объекта OuterClass, создается дважды
InnerClass.hpp:
#ifndef INNERCLASS_HPP_
#define INNERCLASS_HPP_
class InnerClass {
public:
int a;
InnerClass();
InnerClass(int);
~InnerClass();
};
#endif /* INNERCLASS_HPP_ */
InnerClass.cpp:
#include "InnerClass.hpp"
#include <iostream>
InnerClass::InnerClass() {
a = 1;
std::cout << "inner class constructed, a = " << a << std::endl;
}
InnerClass::InnerClass(int x) {
a = x;
std::cout << "inner class constructed, a = " << a << std::endl;
//automatically: object InnerClass (a=3) is destroyed here...
}
InnerClass::~InnerClass() {
std::cout << "inner class destructed, a = " << a << std::endl;
}
OuterClass.hpp:
#ifndef OUTERCLASS_HPP_
#define OUTERCLASS_HPP_
#include "InnerClass.hpp"
class OuterClass {
private:
InnerClass blah;
public:
OuterClass();
~OuterClass();
void doSth();
};
#endif /* OUTERCLASS_HPP_ */
OuterClass.cpp:
#include "OuterClass.hpp"
#include <iostream>
OuterClass::OuterClass() {
// automatically: blah = InnerClass();
std::cout << "outer class constructing started, blah.a = " << blah.a << std::endl;
blah = InnerClass(3);
std::cout << "outer class constructed" << std::endl;
}
OuterClass::~OuterClass() {
std::cout << "outer class destructed" << std::endl;
}
void OuterClass::doSth() {
std::cout << "doSth: " << blah.a << std::endl;
}
главная:
#include "OuterClass.hpp"
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Compiled at " << __TIME__ << std::endl;
OuterClass x = OuterClass();
x.doSth();
std::cout << "done" << std::endl;
}
выход:
Compiled at 12:11:12
inner class constructed, a = 1 //this is unexpected
outer class constructing started, blah.a = 1 //this should be random data
inner class constructed, a = 3
inner class destructed, a = 3 //this is unexpected
outer class constructed
doSth: 3
done
outer class destructed
inner class destructed, a = 3
Вопросы:
- Почему конструктор по умолчанию InnerClass вызывается в начале OuterClass конструктора?
- Что и почему разрушено в конструкторе OuterClass («внутренний класс разрушен, a = 3 // это неожиданно»)?
- Похоже, что объект InnerClass с a = 3 был разрушен в конструкторе OuterClass, чем почему метод doSth() возвращает 3 вместо случайных данных?
- Почему удаление конструктора InnerClass() (из файлов InnerClass.hpp и InnerClass.cpp) приводит к ошибке времени компиляции в конструкторе OuterClass в файле OuterClass.cpp? Ошибка говорит о том, что определение InnerClass() не найдено.
Я думаю, вы должны были использовать InnerClass * blah? Тогда не будет никакой двойной конструкции. InnerClass blah автоматически создаст локальный экземпляр при создании, который вы перезапишете в конструкторе. В конце концов он разрушен (вместо того, чтобы стать утечкой mem (ну, даже те, которые становятся понятны после выхода приложения)), поскольку он имеет локальную область действия, как только весь объект деконструируется. --- Кстати, ваш код правильный? blah = InnerClass (3); должен вызвать нового оператора ??? –