Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
#1

Ошибка при работе с объектом класса в конструкторе другого класса

29.10.2016, 17:37. Просмотров 293. Ответов 13
Метки нет (Все метки)

Имеется данный код: https://github.com/ubelian/glgame/tree/master/glgame

В файле Food.cpp в конструкторе класса Food::Food() на 19 строке закомментировано обращение объекта snake класса Snake к методу getHeadCP();. Эта строка вызывает некую ошибку в процессе работы программы, которую понять я не могу. Если snake.getHeadCP() написать не в конструкторе, а в любом другом методе, то все работает нормально. Можно было бы подумать, что объект food класса Food создается раньше чем snake, но это не так. Прошу помощи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2016, 17:37
Ответы с готовыми решениями:

Создание объекта класса с полем являющимся объектом другого класса
Bill a; cin>>a;//тут я ввел с помощью перегруженного оператора ElementSpiska...

Инициализация объектов класса в конструкторе другого класса
У меня есть класс Subscriber,в котором есть несколько объектов другого класса...

Ошибка при вызове метода класса в методе другого класса
Господа программисты, возникла такая проблема. При вызове метода класса в...

Массив объектов в конструкторе другого класса
есть класс A: class A{ public: double *weights; A() { } A(int a) {

Ошибка компиляции (преобразование объекта класса в объект другого класса)
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции......

13
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,042
29.10.2016, 19:34 #2
Цитата Сообщение от Sinkha Посмотреть сообщение
Эта строка вызывает некую ошибку
И как это выглядит?
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
29.10.2016, 19:49  [ТС] #3
Цитата Сообщение от nd2 Посмотреть сообщение
И как это выглядит?
Привет. Выскакивает ошибка "Прекращена работа программы "glgame.exe" ".
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,042
29.10.2016, 19:59 #4
Цитата Сообщение от Sinkha Посмотреть сообщение
Выскакивает ошибка "Прекращена работа программы "glgame.exe" ".
Больше ничего не пишет? В чём собираешь? Debug?

Добавлено через 4 минуты
Глобальные объекты Food есть?
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
29.10.2016, 20:12  [ТС] #5
Цитата Сообщение от nd2 Посмотреть сообщение
Глобальные объекты Food есть?
Есть. Я давал уже ссылку сверху на исходный код, может поможет. Не пойму в чем дело. По любому же ошибка банальная
0
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
29.10.2016, 20:15 #6
Sinkha, у вас неправильный подход. Объекты классов Food и Snake определены как глобальные в разных единицах трансляции (в разных cpp-файлах). Стандарт языка не гарантирует порядок инициализации объектов в таких случаях.
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,042
29.10.2016, 20:16 #7
Цитата Сообщение от Sinkha Посмотреть сообщение
Есть.
Если есть, то где гарантия, что он создаётся (а значит и конструктор вызывается) позже, чем глобальный snake?
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
29.10.2016, 20:38  [ТС] #8
Цитата Сообщение от castaway Посмотреть сообщение
Sinkha, у вас неправильный подход. Объекты классов Food и Snake определены как глобальные в разных единицах трансляции (в разных cpp-файлах). Стандарт языка не гарантирует порядок инициализации объектов в таких случаях.
Это объясняет уже пару вещей. А как правильно объеденить все эти определения в 1ой единице трансляции?
0
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
29.10.2016, 20:44 #9
Цитата Сообщение от Sinkha Посмотреть сообщение
Это объясняет уже пару вещей. А как правильно объеденить все эти определения в 1ой единице трансляции?
Вы не поняли. Вам вообще следует избавиться от глобальных объектов.
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
29.10.2016, 20:52  [ТС] #10
Цитата Сообщение от castaway Посмотреть сообщение
Вы не поняли. Вам вообще следует избавиться от глобальных объектов.
Но мне нужно использовать snake в другом классе. Как мне быть?
0
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
29.10.2016, 20:56 #11
Цитата Сообщение от Sinkha Посмотреть сообщение
Но мне нужно использовать snake в другом классе. Как мне быть?
Что вам мешает передать объект одного класса в конструктор/метод другого?
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
29.10.2016, 21:21  [ТС] #12
Цитата Сообщение от castaway Посмотреть сообщение
Что вам мешает передать объект одного класса в конструктор/метод другого?
Кстати да. Но я задавался первоначально целью по максимуму все инкапсулировать, чтобы подключил хедеры и РАЗ! и все заработало.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
29.10.2016, 21:32 #13
Цитата Сообщение от Sinkha Посмотреть сообщение
Но я задавался первоначально целью по максимуму все инкапсулировать, чтобы подключил хедеры и РАЗ! и все заработало.
Но Вы включаете хедер в хедер, а не на перекрест хедер одного в cpp другого. Советов не слушаете и говорите, что если включать не так как у Вас сделано, то не работает. Но Вы пробовали не те варианты, что надо. А вариантов много.
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
29.10.2016, 21:50  [ТС] #14
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но Вы включаете хедер в хедер, а не на перекрест хедер одного в cpp другого. Советов не слушаете и говорите, что если включать не так как у Вас сделано, то не работает. Но Вы пробовали не те варианты, что надо. А вариантов много.
Я просто был не в курсе что стандарт не гарантирует создание объекта в заданом порядке, если объявлять глоб переменные в разных файлах. При дебаге выяснилось, что объект snake в конструкторе food в момент вызова конструктора не существует. А перекресное включение нужно было для того чтобы food.cpp не говорил, мол snake не определен, так как он им пользуется.
0
29.10.2016, 21:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2016, 21:50

Как заменить объект List одного класса объектом другого?
к примеру дано нам 1 объект класса Book , я хочу его вставить в класс Table...

Ошибка с памятью при работе класса и map
В общем есть класс тест class test { public: test(void); ~test(void);...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru