![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
serendip |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 20.12.2005 Репутация: нет Всего: нет |
Здравствуйте!
![]() Кто-нибудь видит что-нибудь нехорошее в этих перегрузках?
Работает(вторая) совсем непонятно, вадаёт один и тот же неожидаемый рез-т (1,35244; 1,35244; 0; 0; ...0) И при повторном запуске ошибку(куда-то чего-то не по тому адресу) |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
что такое DMass?
полный код в студию... во второй функции не предусмотрено, мне кажется, разных размеров - откуда ты уверен, что они совпадают - опять же таки полный код DMass. что такое переменная d и чему она равна (или может быть равна?) |
|||
|
||||
threef |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
Я думаю здесь: for (int i=0; i<n; i++) i<n ? либо i<v.n либо this->resize(v.getsize()); |
||||
|
|||||
serendip |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 20.12.2005 Репутация: нет Всего: нет |
Итаак...
Перегрузка та же. Есть ещё одна перегрузка, но она выдает точно такой же результат ![]()
Размер массивов всегда совпадает(так задумывалось) Переменная d - просто обычное число, которое нужно вычесть из каждого эл-та массива. Причём, без перегрузок"^"и"~" пр-мма работает нормально - всё вводит, выводит и даже присваивает объекты (т.е. срабатывает перегр. "=", я надеюсь)
- не помогает. Такая загадка... ![]() ![]() Это сообщение отредактировал(а) serendip - 27.1.2006, 22:29 |
||||||
|
|||||||
BreakPointMAN |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Итак, для начала...
![]()
а в конструкторе ты выделяешь динамически память:
Это означает, что должны быть соответствующим образом определены деструктор данного класса, а также конструктор копирования и операция присваивания. В деструкторе ты должен высвобождать выделенную конструктором память (используя delete), а копировать и присваивать объекты данного класса нужно создавая в каждом из них "свои" динамические данные.. Оператор присваивания у тебя уже определен неверно:
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||||
|
|||||||
serendip |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 20.12.2005 Репутация: нет Всего: нет |
...ну что вам сказать...
![]() ничего не понятно, кроме деструктора ![]() Могу только ответить:"А в учебнике так!":) Т.е вы хотите сказать, что в "=" нужно создавать ещё один объект? |
|||
|
||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Либо в учебнике не так (например, нет выделения памяти с помощью new), либо учебник на свалку... ![]()
Т.е. хочу сказать, что сначала нужно немного почитать про копирование и присваивание, конструкторы и деструкторы... ![]() -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
serendip |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 20.12.2005 Репутация: нет Всего: нет |
![]() ![]() Архангельский ![]() |
|||
|
||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Архангельский для изучения среды C++ Builder хорош, но никак не для изучения языка C++... ![]() ![]() -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
serendip |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 20.12.2005 Репутация: нет Всего: нет |
![]() а вот
и
- не совсем понимаю..Думается мне, что в данном случае в этом нет необходимости. Но мне очень необходмо понять, почему не работают перегрузки! ![]() При объявлении объекта я каждый раз создаю в нём свои динамические данные, разве не так? |
||||
|
|||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Скрытая логическая ошибка (в класофикации граблей № 2):
В функции создается статический объект, при выходе из функции объект автоматически уничтожается. И ссылка на него некоретна. -------------------- Пролетал мимо. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Это что return rr Да это не ссылка на объект. Но вывод за пределы функции результатов убитого уже экземпляра объекта.
-------------------- Пролетал мимо. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Fin
Тогда по твоей логике
тоже не коректно? ![]() |
|||
|
||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Коректно. Компилятор скорее всего сделает такую последовательность команд аcсемблера.
Это сообщение отредактировал(а) Fin - 28.1.2006, 11:13 -------------------- Пролетал мимо. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Fin
Хе. А в том случае вызовет конструктор копирования. А при большом везении просто соптимизирует. |
|||
|
||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Под статический объект в функции отводится память в стэке. При выходе из функции, весь стэк отведенный под функцию возврашается. И дальнейшая ссылка на данную область памяти некоректна.
Это сообщение отредактировал(а) Fin - 28.1.2006, 11:18 -------------------- Пролетал мимо. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Fin |
|
||||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Экземпляр объекта можно создать динамически и статически. Для функции статический экземпляр объекта локален. И тут я не вижу в чем не соответствие.
Компилятору как то по барабану, что ты твориш, самое главное синтаксически правильно. Тебе искать глюки. Лучше сразу делать безглючно, чем весь день сидеть и вылавливать их. Это сообщение отредактировал(а) Fin - 28.1.2006, 11:28 -------------------- Пролетал мимо. |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Такое объяснение не соответсвует принятой в C++ терминологии, и вводит в заблуждение. Локальные объекты имеют automatic storage duration, а static storage duration — это совсем другое. Ты по-прежнему утверждаешь, что вот такой код:
Некорректен? -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
ОК, ребята делайте как хотите. Просто меня иногда достают глюки в неожиданных местах. Поэтому я сразу подстилаю соломку.
-------------------- Пролетал мимо. |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Fin
Забавно, а как ты тогда возвращаешь объекты из функций? Исключительно в куче? -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Fin |
|
||||||||||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Ну чтож, идем к первоисточнику: т.е. к скомпилированному уже коду
![]()
Откомпилированный код, кусок, где идет вызов функции foo
Первые две строки, в стеке под адрес компилятор зарезервировал место, и передает его через стэк в функцию foo. После вызова функции вызывает деструктор, передавая this объекта через регистр cx. Сама функция foo
Парочка коментариев: Строка по адресу 00401067 идет вызов конструктора. В адрес [ebp-10h] скидывается ссылка на экземпляр класса (this) Этот адрес находится в стэке самой функции foo. Строка 0040106F идет копирование инфы с объекта созданного в функции foo в объект созданный в месте, где вызвана функция. Строка 00401080 Идет вызов деструктора экземпляра, который принадлежит функции foo. Строка 00401085 Идет возврат адреса экземпляра через регистр ax, который был передан ранее. Теперь чуть усложним программу.
Выдаваемый результат:
Прошу заметить уважаемую публику, что конструктор для экземпляра с адресом 0x0012FF7C не был вызван. Компилятор пропустил на ура, без проблем. Это сообщение отредактировал(а) Fin - 28.1.2006, 13:22 -------------------- Пролетал мимо. |
||||||||||
|
|||||||||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
И зря тебе так думается. Даже если в конце-концов твой код заработает, неужели тебе не будет неприятно, что он написан криво?.. А если ты не сделаешь то, что тебе посоветовали, то будешь ловить, в лучшем случае, утечки памяти, либо, в худшем, Access Violation'ы. Тебе оно надо? Думаю, что нет... -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
12.8/15 И не ищи проблем на ровном месте. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
BreakPointMAN |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
Конструктор был вызван. Но не конструктор по умолчанию (определенный тобой), а конструктор копирования (созданный неявно). Если ты задаешь его явно, то увидишь, что конструктор вызывается:
-------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
||||
|
|||||
Fin |
|
||||||||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
Еше чуть усложним класс
Получаем результаты:
Теперь раскрываем ремы и делаем ch как ссылка.
Тут же получаем ошибку исполнения. предворительный результат до ошибки:
Вывод: таким способом можно пользоваться, если нет в экземпляре объекта динамических выделений памяти. -------------------- Пролетал мимо. |
||||||||
|
|||||||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Ну ты прям Америку открыл. Понятно что в таком случае нужно самому писать конструктор копирования и оператор присваивания. Ты отвлекся от первоночалного кода, а то что ты привел ничего не доказывает, кроме как пример не до конца дописанного класса. |
|||
|
||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
А если бы мы корректно определили конструктор копирования?
![]() Как-нибудь так (пишу сгоряча, поэтому могу насажать грубых ляпов...):
Так что совет тот же, как и serendip: читай про копирование и присваивание! ![]() Добавлено @ 14:15 Кстати, в исходной программе, открывающей данный топик одна из главных проблем как раз в отсутствии копирующего конструктора и заключается... ![]() -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
ИМХО немного не так. Локальные объекты это те, которые объявлены в local scope. Соответственно они могут иметь как automatic storage duration, так и static storage duration. --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
LPBOY
+1 Сгоряча не оговорил все возможные варианты ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
serendip |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 20.12.2005 Репутация: нет Всего: нет |
Ужас какой...
![]() ![]() И действительно, пр-мма вышла за область выделенной памяти и начала уже буквы выводить ![]() Забавно..В 1-ом сообщении от BreakPointMAN написано самое главное ![]() Ну с трудом как-то верилось.. ![]() Просто я не видела между динамически выделенной памятью и конструктором копирования никакой связи. Прошу прощенья.. ![]() Это сообщение отредактировал(а) serendip - 28.1.2006, 20:39 |
|||
|
||||
blackofe |
|
||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
доусложним усложненную программу ![]()
результат:
- была вызвана функция foo, внутри которой был создан объект типа A (первая выведенная запись). - данный объект был возвращен из функции foo оператором return. при этом используется конструктор копирования, который мы сейчас доопределили явно (у тебя он не был определен, и за тебя его создал компилер) - вторая строчка вывода. обрати внимание - был создан новый объект - совершенно самостоятельный. - далее - выход из области видимости для первого объекта. для него вызывается деструктор (третья строчка вывода). - переменная s - и есть наш новый объект, который был создан путем копирования другого объекта, созданного внутри функции foo. при выходе из области видимости (функции main) для этого объекта вызывается деструктор. опять же можно обратить внимание, что деструктор вызывается для объекта, созданного конструктором копии. так что все правильно. и никакого криминала в возвращении объекта функцией нет. Это сообщение отредактировал(а) blackofe - 2.2.2006, 21:11 |
||||||||||
|
|||||||||||
Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
blackofe Я с этим разобрался. В тот же день я проделал примерно тот же самый код, что и ты привел. Что мы имеем. Двойное создание и копирование класса. При наследовании класса, все время нужно поддерживать конструктор копирования.
И это все благодоря элементарной человеческой лени при написании кода. Я ленив, но не до такой степени. -------------------- Пролетал мимо. |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Fin
Знаешь, это возражения примерно из той же оперы, что и «никогда не пользуйтесь указателями, а то в вашем проекте заведутся маленькие злобные существа — меморилики». Возвращать класс по значению или на куче — исключительно вопрос семантики данного класса.
Элементарная человеческая лень привела к появлению Java и C#, где о таких вещах думать не надо. И это хорошо. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |