| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Почему не срабатывает конструктор? |
| Автор: KaraKum 21.3.2008, 09:37 | ||
| Доброе время суток. У меня такая проблема: В одном .cpp файле располагается код функции WinMain() и всё что обязятельно для любой проги. В .h файле находятся объявления классов. В другом .cpp файле располагаются определения функций классов и вот его код:
Проблема в том, что при создании объекта типа CTank1 не вызывается его конструктор. Я думал, что проблема может быть в разбиении проги на разные файлы и создал функцию Constructor, которая полностью идентична конструктору, так вот она вызывается и значения инициализируются, а если не вызывать Constructor(), то при обращении к переменным XCoord, YCoord и ZCoord прога вылетает, то есть эти переменные не инициализированы. Подскажите, пожалуйста, в чём проблема? |
| Автор: Alek86 21.3.2008, 10:07 |
| KaraKum, сколько у тебя конструкторов определено? если только этот, то он обязан вызваться |
| Автор: baldina 21.3.2008, 10:20 |
| KaraKum, мы не телепаты. Весь код в студию. Если вообще не вызывается, возможно у тебя больше одного объекта определено (например, если определение объекта в .h). |
| Автор: Graf_h 21.3.2008, 10:27 |
| Покажи хедер и срр, тогда можно будет об чем то говорить |
| Автор: baldina 21.3.2008, 10:38 | ||
Вот тут 100%-но вызывается, только какой конструктор для какого sTempPointers? |
| Автор: KaraKum 21.3.2008, 14:19 | ||||||
| У меня такая система файлов в проге: есть файл "Includes.h" в котором находятся все файлы, которые нужно подключить к программе (этот файл подключён к "WinMain.cpp"); для функций и классов по два файла: "Functions.h/.cpp" и "Classes.h/.cpp" - все .h файлы подключены к файлу "Includes.h". Вот файл "Classes.h":
И вот "Classes.cpp":
Функция CTank1.Constructor() вызывается и происходит успешная инициализация переменных XCoord... Но если не вызывать эту функцию, то прога при рисовании этого объекта (так как функция DrawYourself() обращается к этим переменным) вылетает.
Это структура, которая хранит указатель на первый объект списка объектов типа CTank1. И она удачно получает указатель на объект, так как в функции cController.NextStep() вызывается функция DrawYourself() именно с помощью этого указателя. В чём проблема? |
| Автор: Earnest 21.3.2008, 14:36 |
Скорее всего, здесь проблема: в этой точке (в конструкторе) указатель еще не определен, а ты его уже используешь (присваиваешь). Делаю этот вывод из кода вызова: Низя так: в sTempPointers.ptrTank1 еще мусор. Но можно написать в конструкторе sSpaceObjects.ptrTank1 = this. |
| Автор: vinter 21.3.2008, 14:40 | ||||
че то я не понял, ты присваеваешь указатель в конструкторе, который должен быть проинициализирован после вызова оного?
объясни как строчки выше могут согласоваться??? |
| Автор: KaraKum 21.3.2008, 14:55 | ||
Именно! Просто переместил операцию sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1; в функцию CController::FirstInitializations(); и всё заработало! Спасибо за помощь. |