![]() |
|
Модераторы: 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--------------------
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Вы опять наступили на свои грабли.
Определяйте глобальные переменные только в одном месте и все будет нормально. Просто возьмите это за правило. У вас строка SetPower *SetMUni; Есть и в multipower.cpp и в SetPower.cpp (может и еще где - дальше не смотрел) Вы определяете глобальную переменную с одинаковым именем в двух разных модулях программы. Линкер естественно ругается. |
|||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Хоть застрелится блин. Ну никак не могу сделать глобальную, как только уже не пробовал.
В Form1.h в функциях пишу и все нормально создается а когда выношу мусор какой то Во, еще заметел что все что создается не из функций создается каряво, а тоесть правильное только одно поле BitLen что то странное вообще Это сообщение отредактировал(а) maxi91m - 22.10.2009, 22:35 --------------------
|
|||
|
||||
| Anikmar |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Попробуйте так: Создайте GlobalVars.cpp и GlobalVars.h файлы. В cpp внесите строки
В h внесите строки
Уберите из всех остальных файлов проекта (и cpp и H) строку SetPower *SetMUni; Попытайтесь скомпилить. В тех модулях, где ругнется добавьте #include "GlobalVars.h" |
||||||
|
|||||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Неа, указатель в никуда. Я в замешательстве.
1)вставил #include "GlobalVar.h" в Form1.h все скомпилировалась но указатель получился в никуда 2)вставил #include "GlobalVar.h" в Form1.h и в SetPower.cpp аналогично чушь. может что с конструкторами не так.... Это сообщение отредактировал(а) maxi91m - 22.10.2009, 23:12 --------------------
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Вы где проверяете валидность указателя? Имейте в виду, что при каждом нажатии 1-й кнопки он у вас заново создаетеся.
Скиньте последнюю версию того, что у вас есть. |
|||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Там я сейчас пытаюсь понять про констрктор и присваивание, придчуствие что они как то не так работают, все что связанное с указателем осталось, добавил лишь пару объектов.
Присоединённый файл ( Кол-во скачиваний: 3 )
multipower.rar 5,19 Kb--------------------
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
В коде SetMUni = new SetPower(n) Не вызывается конструктор присваивания.
Там идет такая последовательность: 1. Выделяется блок памяти под объект 2. Вызывается конструктор SetPower(int) с параметром n 3. Адрес этого блока присваивается указателю SetMUni |
|||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Хм. как же тогда в явном виде конструктор присваивания вызвать?
--------------------
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
||||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Что же не так работает. не пойму.
понял только одно что все что создается в не функций класса Form1 создается не правильно! А почему? Не пойму... Вот проект, на VS Это сообщение отредактировал(а) maxi91m - 24.10.2009, 10:37 --------------------
|
|||
|
||||
| maxi91m |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 14.1.2007 Где: Нижний Новгород Репутация: нет Всего: нет |
Никто больше ничего не скажет?
--------------------
|
|||
|
||||
![]()
|
| Правила форума "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. |