:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Свойство возвращает неконстантное значение01.09.2015, 15:19. Показов 1248. Ответов 18
Метки нет (Все метки)
Всем привет.
Разъясните мне, по какой такой причине нельзя было сделать возврат из свойства константного значения в VCL? Например, хочу я в Caption у формы значение дописать, пишу:
Приходится для работоспособности писать так:
Сделали бы возврат константы из свойства и код
Ваше мнение?
0
|
01.09.2015, 15:19 | |
Ответы с готовыми решениями:
18
Есть ли в компоненте chart свойство, которое возвращает текущую позицию Указатель не возвращает значение Функция не возвращает значение Функция возвращает значение не полностью |
случайный прохожий
2935 / 1951 / 606
Регистрация: 20.07.2013
Сообщений: 5,159
|
|
02.09.2015, 02:28 | 2 |
Полагаю (если правильно понял "вопрос"), что [к примеру, для Caption] отсутствует "реализация" += либо стоит "заглушка".
Синтаксически все правильно - для String можно использовать +=, поэтому ошибки нет.
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
02.09.2015, 10:24 | 3 |
Вероятно потому, что VCL написано на Делфи, а Дефли не поддерживает обсуждаемые вами вещи. Точно так же, как и не поддерживает оператор +=, так что там аналогичных проблем не возникнет.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||||||||||||||||||||
02.09.2015, 12:23 [ТС] | 4 | ||||||||||||||||||||
Отсутствие реализации или заглушка будет подразумевать, что Caption возвращает какой-то свой тип данных, а не UnicodeString (или другой String'о-подобный в зависимости от версии). Однако Caption возвращает именно строку (копию). В этом легко убедиться:
Любопытно заметить, что например целочисленные свойства типа Tag, Width, Height работают предсказуемо очевидным образом с +=. Т.е. как будто возвращают ссылку:
Если кто в курсе, буду признателен, если поделитесь информацией или ссылками.
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|||||||||||||||||||||
02.09.2015, 12:48 | 5 | ||||||||||||||||||||
Ссылка в любом случае не возвращается. Значение свойства меняется set-методом, а берется get-методом. Досконально работу компилятора не знаю, но, скорее всего,
1
|
Супер-модератор
|
|||||||||||
02.09.2015, 12:49 | 6 | ||||||||||
Tulosba, сравни:
1
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||||||||||
02.09.2015, 13:11 [ТС] | 7 | ||||||||||
Вот этот момент не до конца ясен. Если бы Width было обычным int'ом, то всё понятно.
Но Width это свойство, которое, как я понял, возвращает const int. А для целой константы += не применим. Т.е. исходя из какой логики
С константностью этого поля что-то можешь пояснить? Вот странно, если тут можем вернуть константу, то почему в первоначальной постановке вопроса? Особенно если
0
|
02.09.2015, 13:14 | 8 |
Да это лабуда, где-то они реализовали сокрашенные операции где-то нет, стоит лишь смериться с такой особенностью.
Добавлено через 2 минуты Ну вот констатность не предполагается, как видете в геттере нет константности, видать особенность переноса кода Delphi.
0
|
Супер-модератор
|
|
02.09.2015, 13:15 | 9 |
Еще раз показать описание геттера? По-моему, там очень отчетливо видно, что возвращается новый экземпляр? А в случае Width работа происходит напрямую с полем FWidth, безо всяких сторонних методов, никаких новых экземпляров, поэтому там все работает как задумывалось.
Еще одни писатель. Читать будем, или нет? Выше постом написано, где будут работать сокращенные операции, а где - нет. И почему было написано, только читать и понимать не все почему-то хотят. Атрофия мозга? Все, что выходит за рамки сортировки пузырьком или мерянья временем вычисления факториалов - уже вызывает сложности восприятия? Поменьше в разделах для начинающих сидеть не пробовали?
0
|
02.09.2015, 13:26 | 10 |
Может я понимать вот просто не хочу, если не работает так не работает это плохо и все тут.
А по чему уже не колышыт. Вопрос довольно очевиден, ибо поведение не очевидное.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||||||||||||||||||||||
02.09.2015, 13:58 [ТС] | 11 | |||||||||||||||||||||||||
Запилил я такой класс:
Хотя стоило-то всего лишь сделать:
Но вот ПОЧЕМУ нельзя было так же сделать в VCL??? Снова дельфи виновата?
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
|
02.09.2015, 14:01 | 12 |
А если проверить? В случае int-го свойства при += setter вызывается в независимости от формы getter'а. И работает все верно для обоих вариантов getter'ов. Для String'а да, если в качестве getter'а указано поле, а не метод, то setter не вызывается.
В C++ свойств в принципе нет. В какой то момент при компиляции свойства заменяются на то, что находится после ключевых слов write и read. Конструкции вида a+=b, если оператор += не перегружен, также заменяются на a = a + b. Я предполагаю, что сначала a+=b, заменяется на a = a + b, а потом уже подставляются геттеры и сеттеры. Правда это всего лишь предположение.
0
|
02.09.2015, 14:17 | 13 |
В RAD есть как бы генератор, который автоматом из паскалевских юнитов генирирует плюсовый заголовочный файл (для экспорта)
Вот многое зависит от того как он это делает (не всегда, очевидным/логичным способом) Думаю можно было, вероятно решили не заморачивать, так же есть вариант что потом бы вылезло боком где-то в другом месте. Кроме того в коде Delphi "не так часто встретишь константность"....
1
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
02.09.2015, 14:45 [ТС] | 14 |
Я в курсе Но билдер это не просто C++.
Это не так. Легко проверить, сделав свойство пользовательского типа, для которого оператор не перегружен. Получим ошибку компиляции, а не разворачивание:
Не по теме: Автоматическое разворачивание a+=b в a=a+b, если не ошибаюсь, реализовано в C#. Печально. Боком, правда, вылезает уже сейчас (без const). Видимо придется просто с этим смириться.
0
|
02.09.2015, 15:14 | 15 |
Я бы не сказал что это так критично, все же это только в GUI части.
Да и учитывая экспорт с одного языка в другой и что есть куда более жесткие ограничения связаные с экспортом. Добавлено через 52 секунды
0
|
02.09.2015, 15:31 | 17 |
Могут, но как правило то их вводят для визуального программирования для отображения инспекторе объектов.
Ну а в Delphi это как бы "встроенный механизм", но только в делфи ссылочные типы, нет const в том смысле котором он С++ может быть, нет сокращенных операций.
0
|
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
|
||||||
02.09.2015, 18:50 | 18 | |||||
Сообщение от Tulosba
Сообщение от Tulosba
В ту же тему свойств можно добавить невозможность множественого присваивания, которое является обыденным для C++:
0
|
03.09.2015, 20:02 | 19 |
kodv, в точку, я так полагаю.
VCL ведь никто портировал, исходники на делфи. К ним прикрутили заголовки на плюсах и все. Отсюда все и всяческие приколы с неоднообразностью. Плюс к этому какие-то свойства можно модифицировать напрямую, те, что без сеттеров, какие-то - нет. Почему это так, а не иначе - это уж из области риторики. Разрабы сделали так и пользуйтесь, как хотите.
0
|
03.09.2015, 20:02 | |
03.09.2015, 20:02 | |
Помогаю со студенческими работами здесь
19
Не возвращает значение lpDisplayDevice.DeviceString Свойство конструктора возвращает, но не принимает значение Как вернуть в запросе значение по умолчанию, если SELECT возвращает NULL или ничего не возвращает? XML, Свойство HasChildNodes всегда возвращает true Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |