На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 53 54 [55] 56 57 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата --Ins-- @
    Допустим, мы вызвали какой-то метод, который, казалось бы, никакого отношения к константному объекту не имеет. А он - имел. Либо явно в своем коде, либо через каллбэк поменял значение изначального объекта.

    Пошлет
    ExpandedWrap disabled
      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.


    Добавлено
    Цитата korvin @
    т.е. например пишешь что-то типа

    ExpandedWrap disabled
      [Make, Me, Coffe & Cookies]

    :)
    Цитата korvin @
    и если тут же подключишь какой-нибудь "../OptionParser.h", который тоже экспортирует класс OptionParser, как быть?

    Буду чесать голову, зачем мне два парсера опций ;)
      Цитата Мяут-Настоящий @
      cb(*this);


      Да не передавай ты параметром :) Я разве так написал?
        Цитата --Ins-- @
        Мне три раза написали, что методы других объектов, которые параметрами нас не принимают, МОЖНО вызывать. :)

        Вызвать ты их можешь, да и никто тебя не защитит от side-effects (например глобальной переменной). Но любая передача this очевидно обречена на провал, так как this уже указывает на константный объект. И при грамотном проектировании единственный способ запользовать сам объект внутри метода объекта - использовать this ;-)

        Добавлено
        Цитата --Ins-- @
        Я разве так написал?

        Ты вообще увы не писал ;-)
          Цитата --Ins-- @
          Да не передавай ты параметром :) Я разве так написал?

          А какая разница ? Ему всеравно нужно объект както передать в эту функцию, в данном случае я не вижу других вариантов, кроме как создать еще один класс и описать у него поле-ссылку нашего типа, и инициализировать его нашим объектом... это всеравно не прокатит... или как ты еще собрался в колбек передать наш класс? :scratch:
            Цитата Мяут-Настоящий @
            Но любая передача this очевидно обречена на провал


            Не надо его передавать :) Объект уже и так о нас знает. Скажем, это наш владелец, контейнер или еще кто-то ;)

            Добавлено
            Цитата Мяут-Настоящий @
            Ты вообще увы не писал ;-)


            Писал, не на с++, естественно, а словами
              Цитата --Ins-- @
              Не надо его передавать :) Объект уже и так о нас знает. Скажем, это наш владелец, контейнер или еще кто-то ;)

              покажи кодом хотя бы на делфи, я лично не понимаю тебя :huh:
                Цитата KILLER @
                и инициализировать его нашим объектом...


                Да, но не внутри const-метода. Это могло быть сделано ранее
                  Цитата --Ins-- @
                  Не надо его передавать :) Объект уже и так о нас знает. Скажем, это наш владелец, контейнер или еще кто-то ;)

                  Я тебя не понимаю. Объект не должен видеть дальше своих внутренностей - это инкапсуляция. При использовании const-функций использование операций, которые могут повлиять на внутренности запрещено.

                  Добавлено
                  Цитата --Ins-- @
                  Да, но не внутри const-метода. Это могло быть сделано ранее

                  А как const-метод может дать гарантии, что ничего не сделано до его вызова? Мож он еще и должен гарантировать, что в магазинах не обсчитывают? ;-) Ессно гарантия const-метода распространяется на время от его вызова до завершения ;-)
                  Сообщение отредактировано: Мяут-Настоящий -
                    Цитата --Ins-- @
                    Да, но не внутри const-метода. Это могло быть сделано ранее

                    да, пусть даже через операцию присвоения, только толку нема, всеравно не откомпилится, потому как у тебя указатель на "селф", и компилятор это отслеживает.
                      Цитата KILLER @
                      покажи кодом хотя бы на делфи


                      ExpandedWrap disabled
                        procedure SomeProc(const Obj: SomeClass);
                        begin
                          Какойтодругойобъект.ЛюбойМетод;  // И вот этот ЛюбойМетод может нас поменять? Параметром мы ему себя не передаем. Ссылка на нас у него и так есть - была присвоена когда-то раньше
                        end;
                        Цитата --Ins-- @
                        // И вот этот ЛюбойМетод может нас поменять? Параметром мы ему себя не передаем. Ссылка на нас у него и так есть - была присвоена когда-то раньше

                        В говнокоде все возможно. При соблюдении правил проектирования - ничего он не поменяет.
                          Самое прикольное, что в Borland C++, где property являются расширением языка и подобны дельфийским, можно задавать геттеры, возвращающие константные ссылки. Правда такие свойства лучше не использовать как свойства, "распознаваемые" средой (published) для настройки их в дизайнере - среда глючит при этом неимоверно. Ну и мерзкая проблема как и со свойствами с геттерами, возвращающими значения:
                          object.property++;
                          не изменяет object.property.
                            Цитата --Ins-- @
                            Какойтодругойобъект.ЛюбойМетод;

                            Да, и обращение ко внешней по отношению к объекту среде - первый признак говнокода ;-)
                              Цитата Мяут-Настоящий @
                              Объект не должен видеть дальше своих внутренностей - это инкапсуляция


                              Исключительно свои внутренности он и увидит. Паттерн компоновщик :) Внутренний объект видит ссылку на внешний, внешний - знает о всех своих внутренних, и никакие параметры передавать не нужно, ссылки идят в полях. Пример - древовидный список

                              Цитата Мяут-Настоящий @
                              При использовании const-функций использование операций, которые могут повлиять на внутренности запрещено.


                              Вот я и спрашиваю, кем оно запрещено? ;) И так ли уж запрещено? Или как обычно, нельзя, но если очень хочется...
                                Цитата --Ins-- @
                                Цитата D_KEY @
                                Я прошу показать.


                                Речь идет о том, что объект переданный со словом const в методе не может быть изменен, так? Но вы же говорите что в этом методе можно дергать методы других объектов. А они то откуда знают, что менять объект нельзя? Допустим, мы вызвали какой-то метод, который, казалось бы, никакого отношения к константному объекту не имеет. А он - имел. Либо явно в своем коде, либо через каллбэк поменял значение изначального объекта. Это возможно?

                                Да, ибо никакие гарантии и контракты никто не нарушал.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 53 54 [55] 56 57 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.1525 ]   [ 14 queries used ]   [ Generated: 29.07.26, 11:35 GMT ]