![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
не совсем... я думал привести этот аргумент... тут есть одна тонкость: если поле вычисляемое, в любом случае надо создавать объект, который будет хранить результаты в случае возврата ссылки единственный способ - создать объект в куче и вернуть ссылку на него (потому как возвращать ссылку на временный объект - просто ужасно), это приведет к путаннице с вопросом "кто и когда должен его удалять, чтобы не было утечки памяти" в случае вычислимых полей вариант без ссылки действительно лучше... -------------------- qqq |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 3 Всего: 106 |
пожалуй многие согласятся с тем, что кучу перегруженных operator [] лучше заменить на пару:
operator SomeType*(void) и operator const SomeType*(void) просто подумайте, на сколько это удобно somestor_cl[someindex] - работает (somestor_cl + someindex)->SomeField - работает и не надо лишнее писать:return somestor[index] Ещё один плюс (на мой взгляд - наиболее значимый): в операторе [] - шаблонный класс не сможет выдать подсказку после ".", или "->" при нажатии Ctrl+Space, а в SomeType*(void) - сможет -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Я не очень понял что такое "вычислимые поля", а также почему "в любом случае надо создавать объект". Но проблемы никакой тут нет и копировать ничего не надо. И вообще что ты имел в виду Добавлено @ 17:35
Я не соглашусь. В этом случае класс SomeType будет участвовать и в других контекстах как указатель. Нет причин отказываться от оператора[]. --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| maxim1000 |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
и что они будут возвращать? для этого придется гарантировать, что все объекты контейнера идут по порядку, а это - далеко не самый частый случай...
сможет...(тестировал в Builder'е, VC под рукой нету)
пример: пусть мы сделали класс векторов, у которых координаты образуют арифметическую прогрессию (при создании указывается начало и шаг), при этом нам очень хотелось бы, чтобы была возможность писать cout<<v[6]; все бы хорошо, но хранить все эти значения просто расточительно для такого вектора длиной 100 нужно будет 100 чисел, хотя можно было бы обойтись двумя (начальным элементом и шагом) тогда можно написать такой оператор:
в этом случае ссылку возвращать попросту не на что... -------------------- qqq |
||||||||
|
|||||||||
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 3 Всего: 106 |
поясни, не понял Добавлено @ 17:46
Вот и зря, что нету, "а какие же в билдере богатые шаблоны..." просто так, к слову. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| LPBOY |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Ну ты загнул
Во-первых ты наверное имел в виду не оператор преобразования к SomeType* , а к типу указателя на встроенный тип.
Это я имел в виду что теперь объекты SomeType можно - разыменовывать - складывать с целыми числами - осуществлять неявное преобразование к bool и void* - передавать в функцию, если на самом деле она ждет указатель и т.д. Эти побочные эффекты явно ни к чему. Это сообщение отредактировал(а) LPBOY - 14.10.2005, 17:55 --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||||
|
|||||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 3 Всего: 106 |
Честно говоря, класс, который в операторе [] возвращает элемент, по арифметической прогрессии мне не вселил бы уверенности, т.к. его логика непонятна. Оператор [] изначально подразумевает ВЕКТОР. Не вижу логики, зачем прятать элементарную формулу в контейнере, когда можно( и нужно! ) повесить независимый класс на индекс. Повторюсь, не вижу логики, мы ведь должны облегчить читаемость кода, а не скомпоновать всё и вся
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
А если ещё и не увлекаться explicit конструкторами, то поведение программы может стать непредсказуемым. -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 3 Всего: 106 |
LPBOY
похоже, ты не понял
пример:
это я и имел ввиду! здесь не создаются промежуточные экземпляры, оператор T* ведёт себя, как встроенный оператор [] Это сообщение отредактировал(а) GremlinProg - 14.10.2005, 18:00 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| maxim1000 |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
это был всего лишь пример на вычислимые поля
пример: частоиспользуемый страндартный контейнер map или, например, динамический список с добавленной операцией доступа по номеру...
сильно подозреваю, что и в VC сможет operator[] не очень-то от функции отличается, так что сложность определения, что выдавать при нажатии "." после значения известного типа (а тип известен) не сильно зависит от того, оператор там стоит или функция... Добавлено @ 18:03
я тоже это имел в виду, когда писал, что лучше делать ссылки и там, и там но пример вычислимых полей был приведен, и поспорить, что в этом случае возвращать значение лучше, сложно... а вопрос, насколько часто такое встречается... всякое бывает -------------------- qqq |
||||||||
|
|||||||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Я понял. Я просто говорю про побочные эффекты... Чем тебе оператор [] не нравится?
Просто вариант с оператором преобразования не такой чистый и понятный как с оператором []. --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 3 Всего: 106 |
хорошо, что есть map, а то я и не знал. Вот только нотификации о изменении базы вектора я что-то там не наблюдаю. А ведь это огромный минус и как быть. Понимаешь, не всё можно найти в stl и ей подобных, иногда нужно и свои мозги включать!
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| maxim1000 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
почему непонятна? просто этот класс представляет собой вектора с указанным ограничением никто не запрещает хранить их в классическом виде, но "маскирование" оператора [] позволяет: 1. сократить затраты памяти 2. не заставлять пользователей класса менять свой код или, например, иногда встречаются разреженные вектора - про которые мы знаем, что там будет много нулей опять же можно просто хранить ненулевые поля в списке, а про остальные говорить, что они равны нулю... такие вектора можно использовать при построении разреженных матриц, а это - вообще отдельная тема в численных методах... Добавлено @ 18:08
честно говоря, не понял, что имелось в виду... -------------------- qqq |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 3 Всего: 106 |
class X{ public: X(int){} }; class Y{ public: X operator[](unsigned id){ if(id < length){ X null; return null } return lpvector[id]; } }; допустим, Y - шаблон, а X - параметр шаблона, как в предыдущем варианте, что будет? -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Просвети... --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |