
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.26] |
![]() |
|
Страницы: (117) « Первая ... 76 77 [78] 79 80 ... 116 117 ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#1156
,
|
|
Вот что интересно: если константный метод контейнера возвращает некоторый объект, можно ли у этого объекта дёрнуть неконстантные методы?
|
Сообщ.
#1157
,
|
|
|
Цитата wind @ Вот что интересно: если константный метод контейнера возвращает некоторый объект, можно ли у этого объекта дёрнуть неконстантные методы? смотря какой объект вернул. Если вернул константный объект - то нельзя. |
Сообщ.
#1158
,
|
|
|
Цитата wind @ Вот что интересно: если константный метод контейнера возвращает некоторый объект, можно ли у этого объекта дёрнуть неконстантные методы? Если но возвращает неконстантный объект - то можно. В противном случае - нельзя. |
![]() |
Сообщ.
#1159
,
|
|
Цитата Romkin @ Подобное можно сделать с помощью интерфейсов (да-да, опять ![]() Опять полиморфный оверхед. Цитата wind @ Вот что интересно: если константный метод контейнера возвращает некоторый объект, можно ли у этого объекта дёрнуть неконстантные методы? Если именно объект, то можно, но этот объект не должен быть константным... Если ссылку на объект, то зависит от того является ли она ссылкой на константный объект или нет. Если ссылку на объект, являющийся полем данного класса, то компилятор просто не позволит ему сделать это(в константных методах this имеет тип const T * и, соответственно, все поля становятся константными, но, есть исключения ![]() А как же mutable ![]() |
Сообщ.
#1160
,
|
|
|
Получается что-то подобное
![]() ![]() IMyIntf = interface function GetID: string; end; TMyClass = class(TObject, IMyintf) private FID: string; protected function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; function GetID: string; procedure SetID(const Value: string); public property ID: string read GetID write SetID; end; ... procedure DoWorkWithID(MyIntf: IMyIntf); ... var MyClass: TMyClass; begin MyClass := TMyClass.Create; try MyClass.ID := 'AAA'; ShowMessage(MyClass.ID); DoWorkWithID(MyClass); finally MyClass.Free; end; end; Добавлено Цитата archimed7592 @ Если именно объект, то можно, но этот объект не должен быть константным... Если ссылку на объект, то зависит от того является ли она ссылкой на константный объект или нет. Если ссылку на объект, являющийся полем данного класса, то компилятор просто не позволит ему сделать это(в константных методах this имеет тип const T * и, соответственно, все поля становятся константными, но, есть исключения ). Чур меня! ![]() ![]() |
![]() |
Сообщ.
#1161
,
|
|
Правда, хороший стиль предполагает, что, даже при использовании mutable после вызова константного метода поведение объекта не измениться(т.е. сколько раз константный метод не вызывай - будет возвращать одно и то же).
Добавлено Цитата Romkin @ Чур меня! ![]() ![]() Это ещё цветочки... Кстати, хороший стиль предполагает в любом методе в случае возвращения объекта(а не ссыки, к примеру) возвращать его именно константным ![]() |
Сообщ.
#1162
,
|
|
|
Цитата archimed7592 @ А как же mutable ![]() ну.. мутабл не относится к состоянию объекта, поэтому при изменении мутабл объект не меняется, и как следствие не меняется рекция этого объекта на вызовы. Не... ну конечно можно и константную функцию написать плохо)))... const_cast<A*> (this) и вперед.. ![]() |
Сообщ.
#1163
,
|
|
|
И ты хочешь сказать, что это удобнее, чем явное разделение по интерфейсам, например?
|
Сообщ.
#1164
,
|
|
|
Цитата Romkin @ И ты хочешь сказать, что это удобнее, чем явное разделение по интерфейсам, например? в 1000 раз. |
Сообщ.
#1165
,
|
|
|
Цитата Romkin @ И ты хочешь сказать, что это удобнее, чем явное разделение по интерфейсам, например? Конечно, удобнее. |
Сообщ.
#1166
,
|
|
|
Цитата Flex Ferrum @ Конечно, удобнее. Что-то я сомневаюсь... В Delphi лучше не надо, лучше я отдам интерфейс, и пусть делают, что хотят: никаких исключений... |
Сообщ.
#1167
,
|
|
|
Цитата Romkin @ Цитата Flex Ferrum @ Конечно, удобнее. Что-то я сомневаюсь... В Delphi лучше не надо, лучше я отдам интерфейс, и пусть делают, что хотят: никаких исключений... Ради каждоого чиха интерфейс - так держать! ![]() |
![]() |
Сообщ.
#1168
,
|
|
Цитата Alex Forth @ Ради каждоого чиха интерфейс - так держать! Но если константные методы контейнера будут возвращать неконстантные объекты, то все усилия по обеспечению безопасности пойдут прахом. Поэтому точно так же придётся реализовывать дополнительный интерфейс. |
Сообщ.
#1169
,
|
|
|
Цитата Alex Forth @ Ради каждоого чиха интерфейс - так держать! ![]() Просто мы мыслим различными категориями. Нужно меряться не возможностями языка, а реализацией конкретных алгоритмов на нем. Добавлено Мы вон с Флексом парсеры пишем, а Ромкин с Архимедом взяли бы и другие задачи рассмотрели. Было бы гораздо интереснее. |
![]() |
Сообщ.
#1170
,
|
|
Цитата wind @ Но если константные методы контейнера будут возвращать неконстантные объекты, то все усилия по обеспечению безопасности пойдут прахом. С чего бы вдруг? При возвращении объекта он копируется. Цитата Romkin @ Что-то я сомневаюсь... В Delphi лучше не надо, лучше я отдам интерфейс, и пусть делают, что хотят: никаких исключений... Ещё раз: интерфейс - это оверхэд. И намного накладнее(что проще - одно ключевое слово добавить или городить целый интерфейс?). Добавлено Цитата Smike @ Мы вон с Флексом парсеры пишем, а Ромкин с Архимедом взяли бы и другие задачи рассмотрели. Было бы гораздо интереснее. Предлагай задачку ![]() |