Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Использование собственного класса строк |
Автор: YourLastSong 15.1.2012, 22:22 | ||
Здравствуйте, уважаемые господа. Есть реализация собственного класса строк:
Всё ли здесь так, как надо? Что бы вы предложили добавить сюда и каким образом? Заранее благодарю за возможные ответы. |
Автор: feodorv 15.1.2012, 23:07 | ||||||||||
Вы не доверяете t.length? И нет проверки t.str на NULL. Тоже в других местах.
Круто Вы так побайтно прибавляетесь...
strcpy и так ноль вставляет...
А если i не попадает в указанный интервал, то что возвращается? Опять же, где проверка на NULL? Тогда уж инициализируйтесь в конструкторе пустой сторокой, что ли...
Сначала сравнить на NULL, потом на length, и уж потом strcmp... И зачем в length прибавлять лишнюю единичку (тогда уж по смыслу size)... |
Автор: boostcoder 15.1.2012, 23:11 |
вообще-то, такая архитектура не очень хороша, ибо для того чтоб узнать длину содержащейся строки тебе нужно постоянно использовать strlen(). а если учесть что операций чтения строки всегда больше, и они не могут изменить данные класса - то это вообще сплошной оверхэд! есть два способа: 1. ptr, len, capacity. 2. ptr_beg, ptr_end, ptr_cur. я бы выбрал второй. далее... нет счетчика ссылок. представь ситуацию: у тебя есть одна исходная строка. далее, в коде программы, в алгоритмах, у тебя есть огромное кол-во строк которые инициализируются этой строкой. что происходит? - все кто ссылаются на твою строку, копирует ее. примеряем это к тому правилу то, что читают строку чаще чем изменяют - то копии лишние. они попросту съели память и нагородили оверхэда. читать http://en.wikipedia.org/wiki/Copy-on-write. |
Автор: borisbn 16.1.2012, 13:23 | ||
Для "порядку" проверять, конечно, можно, но delete нормально отрабатывает, если ему дали NULL (вернее - ничего не делает). И ещё: у Вас много повторения кода, от этого лучше избавляться. Например, можно создать private-функцию
и вызывать её как минимум в трёх местах: |
Автор: baldina 16.1.2012, 16:19 | ||||||||
нехорошо, что он void должно быть
иначе нельзя использовать в выражениях типа a = (b+=c), что отличается от поведения стандартных типов. кроме того см. пример ниже излишен, если есть operator+ (const MyString& t) и конструктор из с-строки (а он есть) это позволяет писать
но не позволяет
лучше сделать operator+ свободной функцией, реализованной через operator+=, возвращающий строку
таким образом избавляемся от повторного кода и даем возможность писать "bla-bla" + str Добавлено через 2 минуты и 55 секунд А вообще лучше взять какой-нить промышленный интерфейс строки, например std::string, и рассмотреть его как основу. А в случаях, когда непонятно, почему интерфейс устроен так а не иначе задать вопросы. |
Автор: YourLastSong 16.1.2012, 17:29 | ||
Спасибо. Класс нужен лишь для собственного изучения и прекрасно знаю о том, что такие вещи уже давно реализовали другие люди, причём гораздо более умные. Сам лично использую std::string. Итак, попытался исправить лишь часть недочётов и ошибок:
Есть уже здесь какие-то недочёты, кроме тех, что вы уже назвали? Извиняюсь, если уже надоел. |
Автор: feodorv 16.1.2012, 18:49 | ||
37-я строка:
Что это? |