![]() |
|
Модераторы: bsa |
![]()
|
|
| maxi91m |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Никак не пойму почему когда создаю указатель на объект а потом выделяю память конструктор отрабатывает все создает а потом при возвращение к указателю почему то уже его не существует.
В идеале хочу глобальный объект в Form1.h в SetPower.h содержится конструктор инициализации итд
Form1.h
Присоединённый файл ( Кол-во скачиваний: 4 )
multipower.rar 13,79 Kb--------------------
|
||||
|
|||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Попробуйте так:
строку SetPower *SetMUni,SetM1(1),SetM2(1); перенесите из h файла в cpp, а в h файле сделайте внешнюю ссылку: extern SetPower *SetMUni,SetM1(1),SetM2(1); У вас глобальная переменная определяется с каждым подключением h файла, а вам надо, чтобы она была одна неповторимая. |
|||
|
||||
| maxi91m |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Что то я не понял в каком cpp в срр для самого h файла или же в главном срр?
Если я пишу в SetPower.cpp так то выдает кучу ошибок
а если пишу в multipower.cpp то пишет множественная инициализация
--------------------
|
||||
|
|||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Врядли кучу - всего лишь что тип неопределен и т.п. Итак: в h файле мы ОБЪЯВЛЯЕМ переменную. Т.е. если это глобальная переменная - то extern.... и т.п. Это не создает переменную физически В c-файле уже физически ОПРЕДЕЛЯЕТСЯ сама переменная без extern Если в качества типа переменной используется нечто нестандартное, то перед определением переменной ее нужно объявить - т.е. определение должно стоять после подключения хидера с объявлением |
|||
|
||||
| maxi91m |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Вот так написал
в Form1.h
в SetPower.cpp
Описание функций везде в хидерах
--------------------
|
||||||
|
|||||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
1-я ошибка судя по всему что-то не так в SetPower.h
Остальные тянуться от нее похоже. Покажите SetPower.h |
|||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
--------------------
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Замечание 1.
typedef int MINT; Должен быть только в одном хидере - он у вас дважды определяется как минимум в #include "TBitField.h" и следом отдельной строчкой. |
|||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
убрал typedef int MINT; из SetPower.h
--------------------
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
||||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Все тоже самое
--------------------
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Там подключается Form1.h
Смотрю Form1.h и вижу в начале #include "TBitField.h" #include "SetPower.h" #include <windows.h> SetPower *SetMUni,SetM1(1),SetM2(1); У вас перекрестное подключение хидеров, а это неправильно. Тут надо использовать либо предварительное объявление класса либо переносить инклуды в cpp, если они не нужны в хидерах. Настолько все запутано - уберите лишние инклуды из h-файлов. Плюч непонятное определение SetPower *SetMUni,SetM1(1),SetM2(1); опять в h файле. Не надо в хидере определять переменные. |
|||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
В таком варианте запускается не не правильно работает. Мне на данный момент важно понять почему опять же я создаю указатель на объек он создается но потом кудата теряется а указатель остается прежним.
Если делать через extern то какие инклюды делать в SetPower.срр? я делаю вот так #include "TBitField.h" #include "SetPower.h" SetPower *SetMUni,SetM1(1),SetM2(1); Задача состоит в том что бы создать глобальный объект, но так как я не знаю параметра(я получу его только из объекта формы) я хочу создать указатель на объект а потом уже создать сам объект через SetMUni = new SetPower(s);(я же правильно понмаю что тут вызовется конструктор инициализация объекта и создастся нужный мне объект). Так вот я писал просто перед калссом форма указатель(остольные объекты там для того, что бы запускалась программа), а в классе форма в функции кнопки пишу выделение памяти(как было указано ранее) Просматриваю отладчиком и вижу, что все нормально создается но вдруг после того как отработали конструкторы и вроде объект создан, отладчик возварщается в функцию и я вижу что указатель указывает на какую то чушь. Никак не могу понять почему, что этому способствуюет? Это сообщение отредактировал(а) maxi91m - 22.10.2009, 12:23 Присоединённый файл ( Кол-во скачиваний: 5 )
multipower.rar 4,39 Kb--------------------
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Итак, как я вижу проблему:
файл multipower.cpp - главный файл проекта. в него помещаем глобальную переменную (ваш указатель), который при старте приложения обнуляем. Далее есть файл form1.h В нем код главной формы. Лично я никогда не помещаю код в h-файл и вам не советую (если, конечно, другого выхода нет, например шаблоны) Рекомендую отделить мух от котлет и вынести код в файл cpp Файл setpower.h Содержит класс setpower (вместе с реализацией - ну почему не в cpp?!) и использует класс TBitField. Следовательно требует #include <Tbitfield.h> которого там нет, и непонятно как это компилируется Проверить сам не могу - у меня нет студии. Теперь высматривается вроде такая иерархия классов: Главный модуль - должен содержать #include<setpower.h> так как в нем (в главном модуле в смысле) находится глобальный указатель и определение собственно глобального указателя. ну и наверное #include <form1.h> Главная форма. Должна содержать #include<setpower.h> Объявление глобального указателя можно внести в setpower.h, но это на мой взгляд неправильно. Создайте хидер типа globalvars.h и поместите в него объявление вашего указателя (extern ....) Перед объявлением укажите #include<setpower.h> Если вам покажется, что некоторые инклуды дублируются - это меньшая проблема. Ваша главная проблема использование h-файлов для реализации. Так делать не надо - вы сами видите билиберду. ИМХО (мои советы): Не делайте кода в h файлах, особенно многострочного если только вы не пишете шаблон. Допускайте реализацию методов класса прямо в объявлении только тогда, когда объявляются методы без тела (например - виртуальные) или содержащии одну строку - например, возвращающие значение закрытого члена. Если вы беспокоитесь об inline - компилятор сам за вас побеспокоится Для глобальных переменных создавайте отдельный модуль - в cpp определяем в hpp - объявляем через extern В вашем случае еще введите защиту на повторное создание вашего глобального объекта. Два раза на кнопку ткнули - создали объект второй раз, потеряли предыдущий. |
|||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Программа сейчас запускается он все так же указатель не инициализируется а содержит какой то мусор.
Это сообщение отредактировал(а) maxi91m - 22.10.2009, 19:28 Присоединённый файл ( Кол-во скачиваний: 3 )
multipower.rar 4,78 Kb--------------------
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |