![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
FlySabaka |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
Здравствуйте!
В качестве упражнения создаю класс "больших чисел". Элементы класса: массив из 40 "цифр", знак, и длина числа. Начал реализовывать сложение двух чисел с одинаковым знаком. Реализация верная: если вставить код функции в main.cpp выдает верный ответ. Но функция addHugiInteger работает неверно. При дебаге в этой функции в списке Local variables вижу предупреждение warnind: can't find linker symbol for virtual table for HugeInteger value (см. HugeInteger.cpp строка 85). Работаю в Code::Blocks с компилятором по-умолчанию (GNU GCC compiler). Подскажите, что же я делаю не так? HugeInteger.h
HugeInteger.cpp
main.cpp
|
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
Добавил
Пока это не принесло изменений %) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
На мой взгляд, в данной реализации класса конструктор копирования и оператор присваивания не нужны, так как нет выделения ресурсов подойдет и дефолтный.
Вот виртуальный деструктор нужно сделать обычным, так как нефиг наследовать этот класс. FlySabaka, ты уверен, что у тебя свойство sign не может принимать нулевых значений? |
|||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
bsa, sign может принимать нулевое значение. я предусмотрел это на случай ошибки (например инициализация объекта класса не числом типа "+234", а фигней типа "бла-бла-бла"). Пока всех проверок на корректность я в функции не сделал.
Но при отладке addHugeInteger для указанных в main.cpp значений всё корректно: sign и other.getSign() равны -1. Это сообщение отредактировал(а) FlySabaka - 8.10.2010, 12:37 |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
это весь код оператора присваивания ? Добавлено через 3 минуты и 14 секунд
в данном случае большая вероятность добавления выделения ресурсов, так что, имхо, копи конструктор добавить сразу, чтоб глаз мозолил ![]() а вот оператор присвоения для приведенного примера действительно выглядит лишним.. |
||||
|
|||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
mes, да, это весь код оператора присваивания. Code::Blocks генерит этот код при создании класса с помощью визарда (опционально).
Хотя я вроде нигде не присваиваю объекты класса HugeInteger друг другу, так что этот код не используется (насколько я понимаю). Это сообщение отредактировал(а) FlySabaka - 8.10.2010, 12:57 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
mes, понял. Согласен что сморозил глупость
![]() Но проблема все равно возникает до присваивания, в теле функции addHugeInteger при создании объекта res класса HugeInteger, как я и писал выше. Безусловно предпосылки к этой проблеме находятся где-то в другом месте (мож конструктор у меня какой-то не такой, а?) .. Это сообщение отредактировал(а) FlySabaka - 8.10.2010, 13:03 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну тогда и как исправить ошибку, как мне кажется Вы уже поняли ![]() |
|||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
mes, Вы намекаете, что ошибка в операторе присваивания? можно уточнить, в чём именно ошибка, а то недогоняю?
![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
не стыкуется ![]() Добавлено через 2 минуты и 52 секунды раз в main выдает правильно, значит потеря идет при передаче результата поэтому вначале я предположил , что у Вас нет копи конструктора.. оказалось проще: Вы просто добавили пустой (по смыслу работы) оператор присваивания ![]() Добавлено через 5 минут и 10 секунд уберите оператор присваивания, перенеся селфхандлинг в копиконструктор (хотя можно и его убрать ) |
|||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
mes, спасибо за помощь.
Изменил оператор присваивания на
Приблизительно понял, почему не работает "старая версия". Буду экспериментировать ... учиться, учиться и ещё раз учиться ![]() P.S. По пути еще косяки нашёл в реализации функции, так что диву даюсь почему она мне правильно выдавала ответы непосредственно в main.cpp. Это сообщение отредактировал(а) FlySabaka - 8.10.2010, 13:18 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
а чего self-handling закомментили ? полезная вещь
![]() а наверно из за этого : но тут я о копиконструкторе говорил ![]() в данном случае имхо нагляднее будет
|
|||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
mes, здесь в операторе присваивания я его просто забыл удалить (что собственно уже сделано), в копи конструктор вставил.
Я понимаю, что лимит глупых вопросов я на сегодня исчерпал, но тем не менее, как нам удаётся получить доступ к закрытым данным класса делая такой вот финт:
? Так действительно намного нагляднее ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |