![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Mr_Nuke |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
Собственно проблема такая.
Дана следующая программа:
---------------------------------- Суть Проблемы: Происходит суммирование, результат записывается в Z, Однако информация, находившая в X и Y потеряна. Вместо нее записаны какие то символы. Испробовано:
Почему возникает такая проблема, и какими еще способами ее можно исправить. Исходник приведен ниже [*] Заранее спасибо!
Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
||||
|
|||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
для начала, это неверно
правильно: s= new char [ strlen( x.s ) + strlen( y.s) ]; пардон, вернее так: s= new char [ strlen( x.s ) + strlen( y.s) + 1];
пользуетесь динамической памятью, а конструктор копирования не нарисовали
повезло просто скорее всего. Это сообщение отредактировал(а) zkv - 6.4.2007, 21:54 |
||||
|
|||||
Mr_Nuke |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
я не так давно начал изучать Объектно ориентированное... не объяснишь про конструктор копирования пару сторк?
|
|||
|
||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
||||
|
||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
при передаче в функцию объекта по значению создается копия объекта (есть еще пара таких случаев ;-)), для этого вызывается конструктор копирования, если пользователь не определил этот самый конструктор, то его создает сам компилятор. Конструктор копирования по умолчанию (вроде так он называется), просто копирует значения всех членов-данных. У тебя в этом случае копируется указатель на строку, а не сама строка, те объект в памяти остается один, а указатель на него копируется, что может привести к неприятным последствиям, если ты обратишься к этому объекту после вызова деструктора хотя бы в одном из объектов. Скорее всего не это привело к ошибке в твоей программе, там и без этого интересностей хватает ![]() Например: видимо вместо '\t' ты имел ввиду '\0'? Наверное длину строки определял? Это можно сделать функцией strlen(). Да, в твоем случае конструктор копирования должен выглядеть примерно так:
Хотя надо еще исправить этот косяк: на
Еще советую научиться нормально оформлять код (невозможно читать, место экономишь?), и выбирать более осмысленные имена идентификаторам. Ну еще неплохо сразу научить себя разделять объявление класса и реализацию его методов. Удачи! Это сообщение отредактировал(а) zkv - 6.4.2007, 22:47 |
||||
|
|||||
threef |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 9 Всего: 10 |
не забудь поправит деструктор
иначе будет утечка памяти. delete s; освобождает память размером с один символ |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Xenon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Daevaorn, это просто UB без каких-либо предположений
![]() |
|||
|
||||
Mr_Nuke |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
Да, определял я действительно длинну строки. Ток когда я смотрел через debug-watch, в конце строки почему то стояло '\t' На счет оформления кода - скопировал пост с сайта, где до этого размещал свою задачку.... там сайт автоматом делал вот такое вот выравнивание. Я тут первый раз, и как то не пришло в голову, что тут по другому. Поэтому и прикрепил cpp файл. и что такое UB? На счет остальных советов - буду сидеть, разбираться. Отпишусь, если будет что непонятно. Всем огромное спасибо! |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Mr_Nuke |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
И еще один вопросик. Что делает "const"?
Чем отличается "str(char *st)" от "str( const char *st )" ? |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
оно делает как раз то, что это слово означает ![]() |
|||
|
||||
bsa |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Это больше касается качества кода. Т.е. объявляя функцию с константным указателем или ссылкой в качестве параметра, ты гарантируешь всем, кто ее использует (а так же компилятору, который компилирует твой код), что ты не изменяешь переменную, на которую указывает указатель или ссылка. Другими словами, если ты по ошибке напишешь это:
Больше того, у методов классов тоже есть модификатор const, который означает, что данный метод не меняет аттрибуты класса. По мимо всего прочего, данные модификаторы помогают при написании программы. Например, ты пишешь класс, у которого есть метод size():
|
||||||||
|
|||||||||
Mr_Nuke |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
Все супер! все работает!
![]() остался последний вопрос: про конструктор копирования.
первая строчка "&obStr". все слово является какой то переменной или str - это имя класса? если так, то почему оно с большой буквы? Или это указатель на копируемый объект? |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
obStr - это идентификатор (типа object класса str) знак & - указывает, что объект передается по ссылке. По значению объект в конструктор копирования не передать, так как для этого надо вызвать конструктор копирования ![]() ну так захотелось ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |