![]() |
Модераторы: 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, здесь в операторе присваивания я его просто забыл удалить (что собственно уже сделано), в копи конструктор вставил.
Я понимаю, что лимит глупых вопросов я на сегодня исчерпал, но тем не менее, как нам удаётся получить доступ к закрытым данным класса делая такой вот финт:
? Так действительно намного нагляднее ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
mes, bsa, ещё раз спасибо за помощь
![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
кстати для удобства NUMBER я бы сделал не дефайном, а енумом и внутри класса..
|
|||
|
||||
Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 12 Всего: 14 |
я бы вместо этой функции лучше бы перегрузил оператор + и +=, так было бы удобней и наглядней работать с классом. |
|||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
Crafty, поскольку я пишу "учебный" код, то я и перегрузку операций сделаю. У меня ещё все в переди
![]()
Пока не оч понимаю, а в чём будет заключаться удобство? |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
define таит в себе очень много проблем.. например игнорирование области видимости, которое заставляет выбирать для него длинные имена, чтоб избежать коллизии.. В общем придет с опытом.. а пока возьмите за правило не использовать дефайн, где можно обойтись другими средствами вот например дефайн удобно использовать как задание опции при компиляции.. т.е. что укажете компилятору, то он и подставит.. Но в таких случаях желательно использовать более уникальное имя и дать возможность его переопределить "снаружи". т.е. для Вашего случая выглядело бы примерно так :
Использование енума приносит ряд преимуществ, 1. зависимость от дефайна в одном месте, в остальном используется сам енум 2. удобство имени / отсутствие проблем с "внешними " именами 3. независимость от значения дефайна.. т.е например дефайн использует длину в байтах, а в реализации Вам удобнее мерять интегерами, тогда
4. действие дефайна становится локальным (при использовании #undef) и еще множество мелочей о которых сразу и не вспомнить ![]() Это сообщение отредактировал(а) mes - 8.10.2010, 20:54 |
||||
|
|||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
mes, признаться честно преимущество на данный момент мне всё равно не ясно (и где-то там, в подсознании быть может, предложенная идея кажется полезной). Про коллизии, define и длинные имена это я понял. В любом случае, совету опытных я последую.
FIX: mes, вот теперь более понятны преимущества, спасибо за доходчивый ответ ![]() P.S. Первоначально я вообще хотел использовать динамические массивы, ибо меня напрягают искусственные ограничения на длину числа. Но вот посмотрел я, что на просторах интернета realloc ругают, и хают, и отказался от этой идеи (имеется в виду применение realloc в c++). Не представляю как грамотно "удлинить"/"укоротить" число (читай массив), не используя realloc (есть конечно вариант с введением временной переменной нужного размера, и копирования первого массива с последующий дозаписью новых цифр, но некрасиво ведь по-моему) Это сообщение отредактировал(а) FlySabaka - 8.10.2010, 18:17 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
http://cplusplus.com/reference/stl/vector/ |
|||
|
||||
FlySabaka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.9.2010 Где: г.Новосибирск Репутация: нет Всего: нет |
mes, да-да, это я видел. может быть создам HugeInteger v.2. с использованием vector. В любом случае и такая реализация - неплохая практика для начинающего изучение C++. Тут не цель главное, а процесс
![]() |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну вот навскидку ситуация, которая при невнимании к варнингам, может одарить долгими часами дебага
![]() Это сообщение отредактировал(а) mes - 8.10.2010, 18:44 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "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. |