Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 53 54 [55] 56 57 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#811
,
|
|
|
|
Цитата --Ins-- @ Допустим, мы вызвали какой-то метод, который, казалось бы, никакого отношения к константному объекту не имеет. А он - имел. Либо явно в своем коде, либо через каллбэк поменял значение изначального объекта. Пошлет ![]() ![]() class A { int i; public: typedef void(A_cb)(A&); int get() const { return i; } void set(int a) { i = a; } void ins_hack(A_cb cb) const { //Вызываем меняющий callback cb(*this); } }; void fn(A& a) { //Таки меняем a.set(10); } int main() { A a; a.ins_hack(fn); return 0; } Цитата t.cpp: In member function 'void A::ins_hack(void (*)(A&)) const': Line 14: error: invalid initialization of reference of type 'A&' from expression of type 'const A' compilation terminated due to -Wfatal-errors. Добавлено ![]() ![]() [Make, Me, Coffe & Cookies] Цитата korvin @ и если тут же подключишь какой-нибудь "../OptionParser.h", который тоже экспортирует класс OptionParser, как быть? Буду чесать голову, зачем мне два парсера опций |
|
Сообщ.
#812
,
|
|
|
|
Цитата Мяут-Настоящий @ cb(*this); Да не передавай ты параметром Я разве так написал? |
|
Сообщ.
#813
,
|
|
|
|
Цитата --Ins-- @ Мне три раза написали, что методы других объектов, которые параметрами нас не принимают, МОЖНО вызывать. ![]() Вызвать ты их можешь, да и никто тебя не защитит от side-effects (например глобальной переменной). Но любая передача this очевидно обречена на провал, так как this уже указывает на константный объект. И при грамотном проектировании единственный способ запользовать сам объект внутри метода объекта - использовать this ;-) Добавлено Цитата --Ins-- @ Я разве так написал? Ты вообще увы не писал ;-) |
|
Сообщ.
#814
,
|
|
|
|
Цитата --Ins-- @ Да не передавай ты параметром Я разве так написал? А какая разница ? Ему всеравно нужно объект както передать в эту функцию, в данном случае я не вижу других вариантов, кроме как создать еще один класс и описать у него поле-ссылку нашего типа, и инициализировать его нашим объектом... это всеравно не прокатит... или как ты еще собрался в колбек передать наш класс? |
|
Сообщ.
#815
,
|
|
|
|
Цитата Мяут-Настоящий @ Но любая передача this очевидно обречена на провал Не надо его передавать Объект уже и так о нас знает. Скажем, это наш владелец, контейнер или еще кто-то Добавлено Цитата Мяут-Настоящий @ Ты вообще увы не писал ;-) Писал, не на с++, естественно, а словами |
|
Сообщ.
#816
,
|
|
|
|
Цитата --Ins-- @ Не надо его передавать Объект уже и так о нас знает. Скажем, это наш владелец, контейнер или еще кто-то ![]() покажи кодом хотя бы на делфи, я лично не понимаю тебя |
|
Сообщ.
#817
,
|
|
|
|
Цитата KILLER @ и инициализировать его нашим объектом... Да, но не внутри const-метода. Это могло быть сделано ранее |
|
Сообщ.
#818
,
|
|
|
|
Цитата --Ins-- @ Не надо его передавать Объект уже и так о нас знает. Скажем, это наш владелец, контейнер или еще кто-то ![]() Я тебя не понимаю. Объект не должен видеть дальше своих внутренностей - это инкапсуляция. При использовании const-функций использование операций, которые могут повлиять на внутренности запрещено. Добавлено Цитата --Ins-- @ Да, но не внутри const-метода. Это могло быть сделано ранее А как const-метод может дать гарантии, что ничего не сделано до его вызова? Мож он еще и должен гарантировать, что в магазинах не обсчитывают? ;-) Ессно гарантия const-метода распространяется на время от его вызова до завершения ;-) |
|
Сообщ.
#819
,
|
|
|
|
Цитата --Ins-- @ Да, но не внутри const-метода. Это могло быть сделано ранее да, пусть даже через операцию присвоения, только толку нема, всеравно не откомпилится, потому как у тебя указатель на "селф", и компилятор это отслеживает. |
|
Сообщ.
#820
,
|
|
|
|
Цитата KILLER @ покажи кодом хотя бы на делфи ![]() ![]() procedure SomeProc(const Obj: SomeClass); begin Какойтодругойобъект.ЛюбойМетод; // И вот этот ЛюбойМетод может нас поменять? Параметром мы ему себя не передаем. Ссылка на нас у него и так есть - была присвоена когда-то раньше end; |
|
Сообщ.
#821
,
|
|
|
|
Цитата --Ins-- @ // И вот этот ЛюбойМетод может нас поменять? Параметром мы ему себя не передаем. Ссылка на нас у него и так есть - была присвоена когда-то раньше В говнокоде все возможно. При соблюдении правил проектирования - ничего он не поменяет. |
|
Сообщ.
#822
,
|
|
|
|
Самое прикольное, что в Borland C++, где property являются расширением языка и подобны дельфийским, можно задавать геттеры, возвращающие константные ссылки. Правда такие свойства лучше не использовать как свойства, "распознаваемые" средой (published) для настройки их в дизайнере - среда глючит при этом неимоверно. Ну и мерзкая проблема как и со свойствами с геттерами, возвращающими значения:
object.property++; не изменяет object.property. |
|
Сообщ.
#823
,
|
|
|
|
Цитата --Ins-- @ Какойтодругойобъект.ЛюбойМетод; Да, и обращение ко внешней по отношению к объекту среде - первый признак говнокода ;-) |
|
Сообщ.
#824
,
|
|
|
|
Цитата Мяут-Настоящий @ Объект не должен видеть дальше своих внутренностей - это инкапсуляция Исключительно свои внутренности он и увидит. Паттерн компоновщик Внутренний объект видит ссылку на внешний, внешний - знает о всех своих внутренних, и никакие параметры передавать не нужно, ссылки идят в полях. Пример - древовидный списокЦитата Мяут-Настоящий @ При использовании const-функций использование операций, которые могут повлиять на внутренности запрещено. Вот я и спрашиваю, кем оно запрещено? И так ли уж запрещено? Или как обычно, нельзя, но если очень хочется... |
|
Сообщ.
#825
,
|
|
|
|
Цитата --Ins-- @ Речь идет о том, что объект переданный со словом const в методе не может быть изменен, так? Но вы же говорите что в этом методе можно дергать методы других объектов. А они то откуда знают, что менять объект нельзя? Допустим, мы вызвали какой-то метод, который, казалось бы, никакого отношения к константному объекту не имеет. А он - имел. Либо явно в своем коде, либо через каллбэк поменял значение изначального объекта. Это возможно? Да, ибо никакие гарантии и контракты никто не нарушал. |