|
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
|
||||||
Свой класс string, нужна помощь с перегрузкой операторов15.01.2024, 17:03. Показов 6753. Ответов 99
Доброго времени суток.
Создал свой класс string. Цель создания своего класса строк - это скорость работы со строками и второе в образовательных целях. Если реализация получится удачной сделаю библиотеку для личного использования. Сейчас реализованы строки типа char потом добавлю wchar_t. new и delete решил не использовать, так как использую простой тип char. Вроде утечек памяти нет, а работать в теории должно быстрее. Прошу просмотреть код и дать рекомендации по оптимизации или указать на ошибки в коде, буду очень признателен. У меня возник вопрос с перегрузкой операторов, не понимаю как их сделать правильно, представленная реализация вроде работает правильно. Подскажите как правильно перегрузить [], +=, =, +. За ранее благодарю за ответы.
0
|
||||||
| 15.01.2024, 17:03 | |
|
Ответы с готовыми решениями:
99
Класс "Массив дробных чисел" с перегрузкой операторов Класс "Длинные числа" с перегрузкой операторов Создать класс "деньги" с перегрузкой операторов |
|
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
|
||||||
| 17.01.2024, 20:04 [ТС] | ||||||
|
Пока так
0
|
||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||||
| 17.01.2024, 20:33 | ||||||
|
Основное что надо бы доработать, на мой взгляд - если в методе на входе у вас уже объект string - не переводите его в char* !!
Кайф же в том, что у вас уже есть длина строки. А вы каждый раз заставляете бегать искать 0 символ, передавая указатель. По мелочи: сразу проинициализируйте поля при объявлении - и не придётся в каждом конструкторе это делать. Это ж кайф, что такую фичу наконец-то подвезли
0
|
||||||
|
фрилансер
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,375
|
|
| 17.01.2024, 20:39 | |
|
Signum7, что сразу, сходу за глаз зацепилось
строки: 2-4 - не плюсовые заголовки 12 - откуда и зачем этот SIZE ? 16-20 - constexpr bool STACK_STRING = (SIZE < 260);30-32 - инициализировать поля. Тогда конструктор по умолчанию можно сделать дефолтным, а остальные - упростить 36 - не нужна проверка на nullptr 40 - возвращаемый тип сделать void 40 - аргумент передать по значению 55 - то же самое 74 - _TRUNCATE - это что-то не стандартное. По крайней мере, я нашёл это только в MSDN для винды98 - список инициализации загадочный 101 - лишняя строка (очищать тут нЕчего) 109 - достаточно delete p_str; - мы же, вроде, топим за быстродействие ? 155 - не нужно this 161 - не нужно this
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 17.01.2024, 20:46 | ||
|
И да, вот еще из важнго
Уберите вы этот clr() !! не нужен он, освобождение памяти из него перенесита в деструктор А в конструкторе его вызывать вообще не надо ни в кое случае! Зачем? вы только что сконструировали и проинициализировали поля свеженького обьекта, какой там clr?? Добавлено через 56 секунд А вот это
0
|
||
|
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
|
|
| 17.01.2024, 20:48 [ТС] | |
|
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||
| 17.01.2024, 20:52 | |||
|
Вопрос, конечно, философский, но если брать за образец std::string, то там длина строки - это количество "реальных" символов, без завершающего нуля, который хранится только для того, чтобы c_str() был вообще возможен и дёшев Добавлено через 2 минуты В самом деле, зачем вам в деструкторе что-то занулять?? по выходу из него объект перестанет существовать, память освободится. Какая разница что там останется? (хотя сейчас пошла мода на секурность освобождаемой памяти, но если с этой точки зрения смотреть - то надо буфер чистить перед освобождением, а не указатель на него после)
0
|
|||
|
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
|
||||||
| 17.01.2024, 21:33 [ТС] | ||||||
|
Так можно перегружать?
0
|
||||||
|
Вездепух
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,348
|
||
| 17.01.2024, 22:31 | ||
|
Попытка модификации объекта через константную ссылку? Реализация, вызывающая сама себя, т.е. бесконечно рекурсивная?
0
|
||
|
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
|
||||||||||||
| 17.01.2024, 23:04 [ТС] | ||||||||||||
получается нужен метод класса куда передавать строку
0
|
||||||||||||
|
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
|
||||||
| 17.01.2024, 23:12 | ||||||
|
по моему вам надо заполнить вот эти поля обьекта по ссылке str в перегрузке
0
|
||||||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
||
| 17.01.2024, 23:44 | ||
|
С другой стороны реализация operator>> для такого класса как string не такая уж и простая. Первое что нужно учесть - в string записывается произвольный размер строки, до первого пробела. А это значит, что вам придется работать с буфером потока. Вот тут была старая тема, про реализацию такого оператора для стандартного string в компиляторе с очень плохой поддержкой стандартной библиотеки. Open Watcom нет перегрузки для оператора ввода для типа std::string Копировать этот код целиком - не стоит. Почерпнуть идеи - можно. ПС. строки 6-7 в вашем коде-по-мотивам должны прийти шаблонными параметрами. Там это сделано иначе потому что Watcom не считает iostream алиасом шаблона - это просто класс (т.е. это обход локальных особенностей того компилятора).
0
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 18.01.2024, 08:18 | |
|
[QUOTE]Пересмотром "уровней абстракций" тут не отделаться/QUOTE]
Ну почему же ? Определение сущностей и необходимых абстракций - часть проектирования. Когда будет ясна задача, тогда и будет возможность адекватного выбора инструментов, подходов. Ну а на данном е апе, только и остаётся что ьыкаться и метаться.
1
|
|
|
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
|
||||||
| 18.01.2024, 17:47 [ТС] | ||||||
|
Так как я буду класс переделывать в шаблонный, решил переписать функции для работы со строками типа strcmp strnlen и пр.. и на первой же попытке воткнулся куча ошибок что я не так делаю в данном примере?
тестовая реализация!
0
|
||||||
|
Вездепух
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,348
|
|||||
| 18.01.2024, 18:33 | |||||
T - это имя параметра, то есть имя переменной. Что тогда значит reinterpret_cast<T>?Не понятно вообще, с какой целью это писалось. Что должна делать эта функция сверх того, что уже умеет делать reinterpret_cast?template и неявного шаблонного синтаксиcа auto. Это не ошибка, но тем не менее. Также: val?
0
|
|||||
|
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
|
||
| 18.01.2024, 18:49 [ТС] | ||
|
но я увидел после вашего замечания, что я передаю имя типа в функцию, хотел что-то типа такого #define cast(T, V) где T тип V Значение которое приводим Так как с шаблонами знаком весьма поверхностно решил потренироваться именно на таких функциях reinterpret_cast и static_cast пока шаблонить не буду так как не знаю как это правильно сделать а шаблонные функции сделаю для своего класса. Если не трудно напишите код как сделать шаблоны для reinterpret_cast и static_cast
0
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 18.01.2024, 19:36 | ||
|
Вам не нужен никакой свой cast
Что по задумке должна делать cust_memset ? я на нее смотрю - и не понимаю. У вас Т - это вот тат самый тип, к которому при надобности можно каститься. Если это понадобится вообще
0
|
||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
||||||
| 18.01.2024, 20:18 | ||||||
|
Signum7, что-то наподобие этого хотели?
* unsigned char, раз уж вы внутри в него кастить собрались, проще сразу получать в параметре; * отдельная функция каста - не нужна. Даже если вы ее напишете, она будет повторять семантику и поведение встроенного каста, и вызов ее будет точно таким же, только вместо reinterpret_cast будет имя вашей функции, т.е. все это будет избыточно; * раз мы принимаем T*, значит size может быть размером последовательности этих T, поэтому, раз уж вы работаете с байтами, нужно будет домножить на sizeof(T); * эта функция имеет смысл только для самообразования, потому что ей никогда не обогнать стандартный memset во многих кейсах, потому что стандартный memset - это не только функция, но и intrinsic компилятора.
2
|
||||||
|
"C with Classes"
|
|
| 18.01.2024, 20:24 | |
|
0
|
|
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
||
| 18.01.2024, 20:29 | ||
|
1
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 18.01.2024, 20:37 | |
|
0
|
|
| 18.01.2024, 20:37 | |
|
Написать класс "Дата" с перегрузкой операторов
Перегрузка операторов. Класс String Свой класс String Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|