Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > неявное преобразование типов |
Автор: zss 6.6.2006, 14:07 | ||||||
есть классы (могут быть ошибки - писал здесь, но думаю смысл понятен)
но я не могу использовать оператор
почему ? ведь оператор определен
|
Автор: LPBOY 6.6.2006, 14:38 |
В таких случаях, для операторов-мемберов, никогда не происходят преобразования. Если у Items нет подходящего оператора=, то просто выдается ошибка. Преобразование произошло бы, если бы мог существовать глобальный оператор Item& operator=(Item& lhs, int rhs){...}. ![]() |
Автор: MAKCim 6.6.2006, 16:22 | ||||||
в C++ нет перегрузки operator.() Добавлено @ 16:29
попробуй через operator->()
но тогда станут доступны через operator->() все public методы Item-а |
Автор: MAKCim 6.6.2006, 16:48 | ||
|
Автор: Earnest 6.6.2006, 18:16 | ||||
MAKCim, мне кажется, первый вариант лучше (только там никто не заставлет указатель хранить, можно и прямо объект). Применение прокси вроде ничем не оправд ано.
Так этого zss и добивается - получить доступ к открытым членам Item. Есть еще вариант с оператором () (если указательная семантика не нравится).
|
Автор: MAKCim 6.6.2006, 19:39 | ||||||
можно ![]()
![]() кроме того есть возможность ограничить использование некоторых методов Item-а (хотя может это и не нужно) |
Автор: Earnest 6.6.2006, 19:56 |
Против таких программистов вообще защиты нет. Только убивать в младенчестве. ![]() Это я к тому, что дизайн должен скорее явно декларировать намерения автора, чем защищать от злонамеренного дурака. |
Автор: MAKCim 6.6.2006, 21:02 | ||
Это да просто в принципе такое можно сделать |
Автор: zss 7.6.2006, 08:03 | ||||
что-то не очень помагает если быть точным, то весь код примерно такой
и тогда
|
Автор: Earnest 7.6.2006, 08:17 |
Опять на те же грабли наступаешь... Оператор преобразования типа здесь не поможет... И вообще, не стоит им злоупотреблять: в данном контексте его применение неоправданно. Короче, прямо по Items (без скобок (), -> или функции get(), как в примере MAKCima, получить доступ к элементам Item не получится. Потому что компилятор не будет применять преобразование типа к левому операнду "[]",".", etc. |
Автор: zss 7.6.2006, 08:42 |
Earnest, блин... но ведь делают как-то. Например многие библиотеки в Builder именно так и работают Значит можно извратиться ![]() Добавлено @ 08:44 не хотелось бы так делать - не совсем понятно (интуитивно) для пользователей |
Автор: MAKCim 7.6.2006, 09:13 | ||||||
а это интуитивно понятно что-ли?
непонятно что за size() есть у Items
если Items непременно должен себя вести как Item может использовать наследование? или это логически/семантически/... не верно будет? |
Автор: zss 7.6.2006, 11:05 |
в последнем примере есть операторы [] - поэтому сразу понятно, что это массивы |
Автор: Earnest 7.6.2006, 13:36 |
Скорее всего это ты что-то не так понял: или наследование, или переопределение необходимых операторов\функций делегированием ([], size(), etc). |
Автор: GremlinProg 7.6.2006, 14:29 | ||||
Использовать можно, например, так:
И не нужно дополнительных классов описывать, только длину нужно вывести в отдельное свойство. PS: Такая каркасная архитектура поддерживается в VC 7.1, другие не проверял |
Автор: zss 7.6.2006, 15:49 |
GremlinProg, на сколько я знаю __declspec это примочка M$ |
Автор: GremlinProg 14.6.2006, 17:54 |
на сколько я знаю __declspec это примочка Visual Studio, по крайней мере с 6-й версии, по моему это уже казано в PS |