![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
YourLastSong |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.12.2011 Репутация: нет Всего: нет |
Здравствуйте, уважаемые господа.
Есть реализация собственного класса строк:
Всё ли здесь так, как надо? Что бы вы предложили добавить сюда и каким образом? Заранее благодарю за возможные ответы. |
|||
|
||||
boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
нет защиты от присваивания себя же. три выделения памяти.
сначала сравни this`ы. и если не равны - strcmp
{ return !(operator==(t)); } портишь кучу. нет проверки на диапазон.
нет одноименных константных методов. это вообще лишнее. Это сообщение отредактировал(а) boostcoder - 15.1.2012, 23:02 |
||||||
|
|||||||
feodorv |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Вы не доверяете t.length? И нет проверки t.str на NULL. Тоже в других местах.
Круто Вы так побайтно прибавляетесь...
strcpy и так ноль вставляет...
А если i не попадает в указанный интервал, то что возвращается? Опять же, где проверка на NULL? Тогда уж инициализируйтесь в конструкторе пустой сторокой, что ли...
Сначала сравнить на NULL, потом на length, и уж потом strcmp... И зачем в length прибавлять лишнюю единичку (тогда уж по смыслу size)... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||||
|
|||||||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
вообще-то, такая архитектура не очень хороша, ибо для того чтоб узнать длину содержащейся строки тебе нужно постоянно использовать strlen(). а если учесть что операций чтения строки всегда больше, и они не могут изменить данные класса - то это вообще сплошной оверхэд! есть два способа: 1. ptr, len, capacity. 2. ptr_beg, ptr_end, ptr_cur. я бы выбрал второй. далее... нет счетчика ссылок. представь ситуацию: у тебя есть одна исходная строка. далее, в коде программы, в алгоритмах, у тебя есть огромное кол-во строк которые инициализируются этой строкой. что происходит? - все кто ссылаются на твою строку, копирует ее. примеряем это к тому правилу то, что читают строку чаще чем изменяют - то копии лишние. они попросту съели память и нагородили оверхэда. читать copy-on-write. Это сообщение отредактировал(а) boostcoder - 15.1.2012, 23:16 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Для "порядку" проверять, конечно, можно, но delete нормально отрабатывает, если ему дали NULL (вернее - ничего не делает). И ещё: у Вас много повторения кода, от этого лучше избавляться. Например, можно создать private-функцию
и вызывать её как минимум в трёх местах: -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
baldina |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
нехорошо, что он void должно быть
иначе нельзя использовать в выражениях типа a = (b+=c), что отличается от поведения стандартных типов. кроме того см. пример ниже излишен, если есть operator+ (const MyString& t) и конструктор из с-строки (а он есть) это позволяет писать
но не позволяет
лучше сделать operator+ свободной функцией, реализованной через operator+=, возвращающий строку
таким образом избавляемся от повторного кода и даем возможность писать "bla-bla" + str Добавлено через 2 минуты и 55 секунд А вообще лучше взять какой-нить промышленный интерфейс строки, например std::string, и рассмотреть его как основу. А в случаях, когда непонятно, почему интерфейс устроен так а не иначе задать вопросы. |
||||||||
|
|||||||||
YourLastSong |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 17.12.2011 Репутация: нет Всего: нет |
Спасибо.
Класс нужен лишь для собственного изучения и прекрасно знаю о том, что такие вещи уже давно реализовали другие люди, причём гораздо более умные. Сам лично использую std::string. Итак, попытался исправить лишь часть недочётов и ошибок:
Есть уже здесь какие-то недочёты, кроме тех, что вы уже назвали? Извиняюсь, если уже надоел. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
37-я строка:
Что это? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |