![]() |
|
Модераторы: bsa |
![]()
|
|
| lega4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
Имеется некоторый класс почти массив. "Почти" - потому что элементы лежат в памяти не по байтам, а по битам и, соответственно, для установки значений и получения значений элементов реализованы специальные функции.
Требуется перегрузить [] так, чтобы: 1. Можно было просто написать unsigned j=myclassvar["abc"], где myclassvar - переменная моего класса, "abc" - название "поля". С этой задачей я справился без проблем, т.к. есть функция возврата значения нужного поля. 2. И чтобы работал такой код myclassvar["abc"]=4; Собственно, со вторым пунктом проблемы. Когда в классе используются встроенные типы данных, то достаточно возвращать ссылку на требуемый элемент класса и все прокатит. А тут непонятно как... Подскажите, пожалуйста. Это сообщение отредактировал(а) lega4 - 4.5.2011, 10:19 |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Перегрузи [] так, чтобы он возвращал ссылку... Ради примера можешь посмотреть в исходники STL, класс vector или list...
-------------------- ![]() |
|||
|
||||
| lega4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
kosmonaFFFt, и вы не поняли вопроса. У меня элементы располагаются побитово. Мне не нужно возвращать весь байт, нужно только нужное поле. Функции для записи и чтения полей уже есть.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
lega4, для этого используют прокси-классы. Т.е. оператор [] твоего класса возвратит объект некого прокси-класса, у которого определен оператор присваивания. Этот оператор уже установит нужный бит в основном классе:
Это сообщение отредактировал(а) bsa - 4.5.2011, 10:24 |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
std::bitset же есть
|
|||
|
||||
| lega4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
bsa, была такая идея, но что-то я ее сразу отмёл, думал, есть способ элегантнее...
Спасибо за пример, написал, теперь индексация работает как надо. Еще хотелось бы перегрузить и другие операторы, например плюс. Я сделал Proxy с полями: адрес "родительского" объекта основного класса, имя поля, unsigned значение поля (Чтобы не лазить каждый раз в родительский объект и еще кой для чего). Для удобности сделал преобразование в unsigned и из unsigned. Подумал, что с учетом преобразований хватит operator+ (const Proxy&) как члена класса. Но тогда на выражение типа a["d"]=a["c"]+5; MSVS ругается, мол, непонятно, какой перегруженный оператор вызывать. Если добавить operator+(unsigned), то все равно ругается... Хотелось бы сделать так, чтобы такие выражения считались без явных приведений типа... Формально вопрос - можно ли указать "приоритет" преобразований типа? Т.е. как в стандартных типах int+double - вопроса не возникнет (Хотя и int можно привести к double, и double к int) - все аргументы приведутся к "старшему" типу (double). Можно ли в своем классе указать "старшинство" типа? Например, считать мой класс самым главным - если он встречается в выражении, но все аргументы будут приводится к нему, а не наоборот. Это сообщение отредактировал(а) lega4 - 4.5.2011, 22:18 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
для начала покажите как у Вас сделано..
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
> a["d"]=a ["c"]+5;
IMHO не стОит увлекаться перегрузкой операторов. Такой код, как это не парадоксально, менее читаемый, чем вызов функции -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| lega4 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
mes, вроде все и без примера должно быть ясно
Выражение типа
Если подумать, то и правда неоднозначно: 1. Можно трактовать как (unsigned)a +5; 2. А можно a+myclass(5); borisbn, по-моему, в таком виде это вполне нормально. Все читаемо)) А на самом деле, это задача не практическая, а учебная, так что практичности не требуется) Это сообщение отредактировал(а) lega4 - 5.5.2011, 06:19 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
мне код легче читать, чем описание.. в коде сразу все видно, а в случае описания надо удерживать в голове все .. а зачем нужен оператор +, если уже есть преобразование к unsigned ? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Это сейчас (через пару дней после написания) читаемо и читаемо тобой. Другому человеку, чтобы понять, что делается здесь - a["d"]=a ["c"]+5 - нужно будет либо в твою документацию, либо в исходники лазать.
С учебной точки зрения уметь перегружать операторы, конечно, нужно, но с практической точки зрения этого лучше не делать. Посмотри, к примеру, STL (его даааалеко не глупые люди писали). Там если и перегружают операторы, то самое очевидное и минимально необходимое (собственно [] и << с >>) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
самая опасная перегрузка - перегрузка операторов преобразования. Этого стоит избегать любыми средствами. То что я привел пример такой, это не значит, что именно так надо делать.
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |