0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 31
1

Не работает конструктор по умолчанию

23.10.2014, 05:02. Показов 2109. Ответов 13
Метки нет (Все метки)

Нужно в конструкторе по умолчанию создать динамический массив и заполнить его элементами, но при компиляции выводится сообщение "Не загружена символьная информация ни для одного кадра стека вызова"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
class mass
{
public: 
mass*ptr;
int N;
mass();
};
mass::mass()
    {
        cin>>N;
        ptr = new mass[N];
        for(int i=0;i<N;i++){};
        };
int main ()
{
mass m1;
}
При этом, если значение N передавать в конструктор из мейна, то всё работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
class mass
{
public: 
mass(int);
mass(){};
};
mass::mass(int N)
    {
        
        mass*ptr= NULL;
        ptr = new mass[N];
        for(int i=0;i<N;i++){};
        };
 
int main ()
{   int N;
    cin>>N;
    mass m1(N);
}
Подскажите, пожалуйста, что делаю не так?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2014, 05:02
Ответы с готовыми решениями:

Не правильно работает конструктор по умолчанию
Вот один из хедеров моей программы. Проблем две, первая: в поля city и street не записывается...

Почему не работает следующий код из книги Страуструпа (конструктор значений по умолчанию)
#include&lt;iostream&gt; using namespace std; class Date { int a, b; static Date default_date;...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1)...

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по...

13
С чаем беда...
Эксперт CЭксперт С++
9993 / 5345 / 1461
Регистрация: 18.10.2014
Сообщений: 12,869
23.10.2014, 05:26 2
Я не знаю, откуда у вас взялось такое странное сообщение, как "Не загружена символьная информация..." или что у вас там.

Ваш конструктор по умолчанию вызывает сам себя рекурсивно. Т.е. допустим при первом вызове конструктора вы ввели 10. После этого вы при помощи 'new[]' выделяете массив из 10 элементов, каждый из который опять конструируется при помощи того же самого дефолтного конструктора. Т.е. вам еще десять раз надо будет ввести размер массива следующего уровня. И т.д. и т.п. Единственный способ выбраться из этой рекурсии - это вводить '0' на очередном уровне рекурсии.

Вот так это у вас работает. И работает без проблем. А уж хотели ли вы именно этого - это уже у вас надо спрашивать.

Добавлено через 8 минут
Ваш второй вариант работает совершенно по-другому. Во втором варианте у вас никакой рекурсии нет. Вы просто вызываете ваш особый конструктор с параметром N. А он уже внутри создает массив из N элементов, "проинициализированных" дефолтным конструктором (а на самом деле никак не проинициализированных, потому что ваш дефолтный конструктор нифига не делает). На этом все заканчивается.

Отдельным вопросом является то, почему это вдруг во втором варианте у вас 'ptr' стал локальной переменной.
1
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 31
23.10.2014, 05:45  [ТС] 3
Тогда вопрос такой, как избавиться от рекурсии в первом варианте?
Т.е заставить его работать так же, как второй вариант и при этом параметр N задавать в самом конструкторе, а не передавать извне?

а про ptr - это опечатка)

Добавлено через 9 минут
И почему если не передавать конструктору параметры, то он вызывает себя рекурсивно? Из мейна вызов конструктора ведь происходит только один раз и в самом конструкторе нет никаких условий, которые бы заставляли его несколько раз себя вызывать. И почему он вообще привязывается к значению переменной ?
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2014, 05:53 4
Цитата Сообщение от Stpelka Посмотреть сообщение
И почему если не передавать конструктору параметры, то он вызывает себя рекурсивно? Из мейна вызов конструктора ведь происходит только один раз и в самом конструкторе нет никаких условий, которые бы заставляли его несколько раз себя вызывать. И почему он вообще привязывается к значению переменной ?
Зачем в классе нужен массив объектов этого же класса?
1
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 31
23.10.2014, 06:00  [ТС] 5
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем в классе нужен массив объектов этого же класса?
Для создания БД

Добавлено через 3 минуты
вообще по заданию нужно просто создать конструктор, который принимает значения данных в диалоговом режиме, но ведь данные нужно куда-то записывать, вот и пришлось создавать массив
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2014, 06:05 6
Цитата Сообщение от Stpelka Посмотреть сообщение
который принимает значения данных в диалоговом режиме, но ведь данные нужно куда-то записывать, вот и пришлось создавать массив
Данные какого типа?
1
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 31
23.10.2014, 06:08  [ТС] 7
Цитата Сообщение от alsav22 Посмотреть сообщение
Данные какого типа?
3 чара и 3 инта
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2014, 06:17 8
Цитата Сообщение от Stpelka Посмотреть сообщение
3 чара и 3 инта
Создавайте структуру с такими полями, в mass - указатель на массив таких структур. В конструкторе mass выделяйте память под этот массив и т.д.
1
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 31
23.10.2014, 06:30  [ТС] 9
Цитата Сообщение от alsav22 Посмотреть сообщение
Создавайте структуру с такими полями,
А без структуры обойтись нельзя?
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2014, 06:38 10
Цитата Сообщение от Stpelka Посмотреть сообщение
А без структуры обойтись нельзя?
А как без неё обойтись, если вы такой тип данных собрались хранить в вашей базе данных?
1
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 31
23.10.2014, 06:43  [ТС] 11
Цитата Сообщение от alsav22 Посмотреть сообщение
А как без неё обойтись, если вы такой тип данных собрались хранить в вашей базе данных?
Просто тогда возникает другая проблема, у этого класса много методов, которые используют для своей работы введённые данные.
Как обращаться к данным находящимся непосредственно в классе - понятно, а как обращаться к данным структуры, которая находится в классе?
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2014, 06:46 12
Цитата Сообщение от Stpelka Посмотреть сообщение
Как обращаться к данным находящимся непосредственно в классе - понятно, а как обращаться к данным структуры, которая находится в классе?
В классе будет массив структру. Как обращаться к элементам массива знаете? Как обращаться, через объект структуры (элемент этого массива), к полям структуры знаете?
1
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 31
23.10.2014, 06:47  [ТС] 13
Цитата Сообщение от alsav22 Посмотреть сообщение
В классе будет массив структру. Как обращаться к элементам массива знаете? Как обращаться, через объект структуры (элемент этого массива), к полям структуры знаете?
Спасибо Вам огромное )
0
С чаем беда...
Эксперт CЭксперт С++
9993 / 5345 / 1461
Регистрация: 18.10.2014
Сообщений: 12,869
23.10.2014, 07:02 14
Цитата Сообщение от Stpelka Посмотреть сообщение
И почему если не передавать конструктору параметры, то он вызывает себя рекурсивно? Из мейна вызов конструктора ведь происходит только один раз и в самом конструкторе нет никаких условий, которые бы заставляли его несколько раз себя вызывать.
Конструктор сам себя не вызывает. Это вы вызываете его рекурсивно.

Выражение 'new mas[N]' выделяет память для N объектов типа 'mas', а затем вызывает для каждого их этих объектов дефолтный конструктор. Поэтому если внутри дефолтного конструктора 'mas' вы делаете 'new mas[N]', вы неявным образом делаете рекурсивный вызов этого же самого конструктора.

Например, вот такой код приведет к бесконечной рекурсии по той же самой причине

C++
1
2
3
4
5
6
7
8
struct C {
   C *p;
   C() { p = new C[10]; }
};
 
int main() {
   C c;
}
В этом нет ничего странного. Но в любом случае ваша задача состоит в том, чтобы эта рекурсия не была бесконечной.

Добавлено через 11 минут
Ну или вот вам еще более простой вариант

C++
1
2
3
4
5
6
7
struct C {
  C() { C c; }
};
 
int main() {
  C c;
}
Вас, надеюсь, не удивляет то, что этот код бесконечно рекурсивен? А если так, то вас не должна удивлять рекурсия и в вашем коде.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2014, 07:02
Помогаю со студенческими работами здесь

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать...

Не работает конструктор копирования по умолчанию
Добрый час друзья , снова нужна Ваша помощь :D на php до этого не писал пытаюсь в никнуть , не могу...

Конструктор с параметрами И конструктор по умолчанию. Как?
Опять прошу совета. Выполняю тут из интернета задания. Класс надо создать, там будут конструкторы и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru