![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| En_t_end |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
В неком классе на основе некого массива есть такой оператор:
Испытываю проблемы при компиляции... ругается на вот такое:
Говорит, что значение может присвоенно быть только переменной, это я и без него знаю(lvalue must be left!) Вот только непонятно почему я не могу присвоить SomeMemb находящемуся в некоторой структуре SomeType значение SomeValue, как надо обращаться в подобных случаях ? |
||||
|
|||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
У тебя перегруженный оператор возвращает копию, а должен возвращать ссылку.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Точно!!!
Вот она ошибка... Добавлено @ 11:22 somestor_cl[someindex]->SomeMemb - это во вторых, а SomeType operator[](unsigned long index){return somestor[index]}; меняем на SomeType* operator[](unsigned long index){return &somestor[index]}; |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
А может вместо
SomeType* operator[](unsigned long index){return &somestor[index]}; лучше будет SomeType& operator[](unsigned long index){return somestor[index]}; и писать потом somestor_cl[someindex].SomeMemb -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
srd
У меня к ссылкам какое-то врожденное недоверие... Добавлено @ 15:20 по мне так лучше возвращать указатель( это из области наглядности, которую мы кстати уже в одной теме обсуждали) |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
В противном случае ты нарушаешь семантику оператора []. Оператор [], возвращающий указатель на объект вместо ссылки, это как оператор +, который вместо сложения операндов их перемножает. -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
ПОЧЕМУ????(ИМХО) ЭТО ОЧЕНЬ ОЧЕНЬ УДОБНЫЙ ИНСТРУМЕНТ. -------------------- Жизнь - печальная штука. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
И еще в пару к нему SomeType operator[](unsigned long index) const {return somestor[index]}; Чтобы совсем было правильно. Это чтобы с константными объектами правильно работалось. И брось на тему ссылок заморачиваться. -------------------- ... |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
а почему не так: const SomeType &operator[](unsigned long index) const {return somestor[index]}; ? просто я представил ситуацию: const SomeType *f(const SomeClass &qqq) { return &qqq[1]; } void g(const SomeClass &qqq) { print(*f(qqq)); } в данном случае будет нехорошо, т.к. f вернет указатель на временный объект, который уничтожится после выхода и распечатается мусор... -------------------- qqq |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Можно и так (если объект большой и его не очень хочется возвращать по значению).
А вот твой пример - это не аргумент. Это в равной степени относится к любым стандартным контейнерам STL. И вообще к любой функции, которая возвращает значение, а не ссылку. Пример:
Ну и ? Такие функции просто не надо писать. Не надо забывать, что C++ дает возможность писать безопасный код, а вовсе не гарантирует безопасность - как бы программист не выделывался. -------------------- ... |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Я так полагаю, что maxim1000 имел в виду другую проблему:
Кошерные оператор [] должен возвращать ссылку, а константынй оператор [] - константную ссылку. -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Не согласна, это пример из той же серии.
Ведь в зависимости от реализации, объект может просто не существовать в памяти, а скажем вычисляться, или еще как-то хитро выковыриваться. Константный опаратор [] должен вызывать нечто, что может быть rvalue, и не обязано иметь адрес. А "кошерный" код не должен закладываться на реализацию. Сегодня я использую массив в памяти (внутри класса), а завтра захочу усложнить реализацию, и все буду хранить, ну не знаю, на соседней машине. Попробуй скажи, что не имею права! И полетит твой код ко всем чертям. Еще раз повторяю - такие функции просто нельз я писать. -------------------- ... |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
вот с чем я тут полностью соглашусь, так это с тем, что и та, и та форма может оказаться правильным решением в конкретной ситуации
просто я стараюсь придерживаться того, чтобы при переопределении какого бы то ни было оператора его семантика менялась как можно меньше, и если информации о ситуации недостаточно, я придерживаюсь этого принципа а взятие адреса поддреживается стандартным [] что касается примера... предположим, что программист написал этот код без использования const он чудесно скомпилится и даже будет работать потом этот программист читает какую-нибудь статью, которая говорит "используйте const везде, где это вам не мешает" и ставит const... и получает ошибку при компиляции и несмотря на то, что действительно виноват программист, а не автор класса, мне это кажется не очень хорошо (опять же - просто кажется)... что касается вычислимых полей, то даже их неконстантная версия [] не должна возвращать ссылку... -------------------- qqq |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Угу. Кроме того зачем нужны лишние расходы на копирование, если можно их избежать? P.S. Хотя спор о ерунде, ИМХО. --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Ну что ж, оператор[], качающий данные с соседней машины - это суровый аргумент
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |