Почему так происходит? C++, инициализация данных
Имеется вот такой код
class Test {
double* data;
public:
Test();
Test(int a);
};
Test::Test() {
Test(5);
}
Test::Test(int a) {
data = new double [a];
}
однако если в программе вызвать
Test* test = new Test();
data будет 0x0000000000000000 почему так происходит? если инициализировать при помощи второго конструктора( с параметром который) тогда всё нормально сразу, но только стоит вложенный использовать все данные куда то пропадают, при отладке их тоже видно, до момента выхода из второго конструктора
Ответы (3 шт):
Предлагаю такой вариант:
...
Test::Test() {
data = new double [5];
}
...
В C++ один конструктор не может вызывать другой внутри своего тела как обычную функцию.
Можно или выносить инициализирующий код в отдельный метод
class Test {
double* data;
init(int a);
public:
Test();
Test(int a);
};
Test::Test() {
init(5);
}
Test::Test(int a) {
init(a);
}
Test::init(int a) {
data = new double [a];
}
или вызывать второй конструктор в списке инициализации как в соседнем ответе
Вызов конструктора, как и другие действия инициализации, должен находится в списке инициализации, а не в теле функции:
Test::Test(): Test{5} {
}
Test::Test(int a): data{new double [a]} {
}
Test(5); в теле функции создает безымянный временный объект, а не вызывает конструктор для этого объекта.
data = new double [5]; присваивает новое значение указателю, а не инициализирует его (хотя тут это ни на что не влияет).