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

    Ну да, ясно. А такой вопрос, можно ли как-то указать, "удалителя" для объекта или все это сильно завязано на языковые механизмы управления памятью? Или в Delphi просто никогда не возникает необходимости работать со своими "менеджерами памяти" или "возвращать" объекты в другую среду(например, при взаимодействие с библиотекой, написанной на другом языке и предоставляющей функции для создания/удаления объектов)?
    Сообщение отредактировано: D_KEY -
      D_KEY
      ExpandedWrap disabled
        TObject = class
          public
           ...
            class function NewInstance: TObject; virtual;
            procedure FreeInstance; virtual;
          end;


      можно перекрыть эти методы и выделять память под объекты как те угодно. Но для класса, доступа к сорцам которого у тебя нет, подсунуть свой менеджер памяти нельзя. Максимум - ты можешь подменить глобальный менеджер памяти, но тогда ты будешь выделять память под все что угодно (строки/дин массивы/объекты) и у тебя не будет возможности знать под что именно ты выделяешь память.
        Цитата jack128 @
        D_KEY
        ExpandedWrap disabled
          TObject = class
            public
             ...
              class function NewInstance: TObject; virtual;
              procedure FreeInstance; virtual;
            end;


        можно перекрыть эти методы и выделять память под объекты как те угодно. Но для класса, доступа к сорцам которого у тебя нет, подсунуть свой менеджер памяти нельзя.

        Да, я помню. У нас примерно та же ситуация с перегрузкой new/delete.
        Другое дело, что shared_ptr'у(и не только) можно указать объект-функцию, которую он должен будет вызвать для удаления объекта.
          Цитата D_KEY @
          А такой вопрос, можно ли как-то указать, "удалителя" для объекта или все это сильно завязано на языковые механизмы управления памятью? Или в Delphi просто никогда не возникает необходимости работать со своими "менеджерами памяти" или "возвращать" объекты в другую среду(например, при взаимодействие с библиотекой, написанной на другом языке и предоставляющей функции для создания/удаления объектов)?

          ExpandedWrap disabled
                class function NewInstance: TObject; virtual;
                procedure FreeInstance; virtual;

          По умолчанию там стандартные GetMem/FreeMem, перекрой - будет как хочется память выделяться.
          Но вот перекрытие для других менеджеров памяти - не встречал. Синглетон на этом делается.

          Добавлено
          Цитата D_KEY @
          Другое дело, что shared_ptr'у(и не только) можно указать объект-функцию, которую он должен будет вызвать для удаления объекта.

          Хм... А если метод класса?
            Цитата Romkin @
            Хм... А если метод класса?
            Забиндить можно.
              Цитата Romkin @

              Цитата D_KEY @
              Другое дело, что shared_ptr'у(и не только) можно указать объект-функцию, которую он должен будет вызвать для удаления объекта.

              Хм... А если метод класса?

              Объект функция - это любой объект с перегруженным operator()(обычную функцию также можно передать - она автоматически преобразуется в указатель на функцию). Кстати, лямбды из нового стандарта тоже подойдут. Да, ты можешь сказать, что нужно вызвать метод какого-то объекта :)
              Сообщение отредактировано: D_KEY -
                Цитата Повстанець @
                Забиндить можно.

                Чего сделать? :wacko:
                  Цитата Romkin @
                  Цитата Повстанець @
                  Забиндить можно.

                  Чего сделать? :wacko:

                  Создать объект(написать лямбду или использоваться стандартные(или бустовые) классы для этого), который при вызове его operator() вызовет нужный метод у нужного объекта.
                    Цитата D_KEY @
                    Создать объект(написать лямбду или использоваться стандартные(или бустовые) классы для этого), который при вызове его operator() вызовет нужный метод у нужного объекта.

                    Ээээ. А чем это отличается от перекрытия виртуального метода FreeInstance? С указанием внутри что дергать?
                    Или это для каждого экземпляра индивидуально? Тогда поле, с обработчиком.
                      Цитата Romkin @
                      Чего сделать? :wacko:
                      Ну так... чтоб понятно было:
                      ExpandedWrap disabled
                        std::function<int(int, int)> f1, f2;
                        some_class some_obj;//допустим у some_class есть метод с сигнатурой int some_class::some_met(int p1, int p2);
                         
                        f1 = some_fun; //some_fun объявлена как int some_fun(int p1, int p2){...}
                        f2 = std::bind(&some_class::some_met, &some_obj, _1, _2);
                         
                        f1(10, 20);//вызывается some_fun с параметрами 10, 20 соответственно
                        f2(10, 20);//вызывается some_class::some_met для объекта some_obj с параметрами 10, 20 соответственно
                        Цитата Romkin @
                        Цитата D_KEY @
                        Создать объект(написать лямбду или использоваться стандартные(или бустовые) классы для этого), который при вызове его operator() вызовет нужный метод у нужного объекта.

                        Ээээ. А чем это отличается от перекрытия виртуального метода FreeInstance? С указанием внутри что дергать?
                        Или это для каждого экземпляра индивидуально? Тогда поле, с обработчиком.

                        1) Для каждого экземпляра можно индивидуально(кстати, объясни про поле и обработчика).
                        2) Можно вызывать совершенно произвольного "удалителя".
                        3) Можно взаимодействовать с библиотеками(например, Сишными(без ++), которые любят предоставлять функции вроде init*/free*).
                          Цитата Повстанець @
                          Ну так... чтоб понятно было:

                          Спасибо. В Delphi если без выкрутасов, то либо лямбда, либо метод объекта или класса, т.е. просто функцию напрямую не присвоишь.
                          ExpandedWrap disabled
                            std::function<int(int, int)> f1, f2;
                            some_class some_obj;//допустим у some_class есть метод с сигнатурой int some_class::some_met(int p1, int p2);
                             
                            f1 = some_fun; //some_fun объявлена как int some_fun(int p1, int p2){...}
                            f2 = std::bind(&some_class::some_met, &some_obj, _1, _2);
                             
                            f1(10, 20);//вызывается some_fun с параметрами 10, 20 соответственно
                            f2(10, 20);//вызывается some_class::some_met для объекта some_obj с параметрами 10, 20 соответственно

                          Что-то вроде
                          ExpandedWrap disabled
                            type
                              TFunc = reference to function(a, b: integer): integer;
                             
                            function some_fun(a, b: integer): integer;
                            begin
                              ...
                            end;
                             
                            var
                              f1,f2: TFunc;
                            ...
                             
                              f1 := function(a, b): integer;
                              begin
                                Result := some_fun(a, b);
                              end;
                              f2 := some_class.some_met;
                              f1(10, 20);
                              f2(10, 20);

                          Должно сработать именно так. Еще и свертку сделать можно при желании.

                          Добавлено
                          Цитата D_KEY @
                          1) Для каждого экземпляра можно индивидуально(кстати, объясни про поле и обработчика).

                          Если индивидуально - значит, ссылку на метод надо где-то хранить. В поле каком-то, либо экземпляра класса. Ну как вариант - запрашивать у класса, что приличествует данному экземпляру.
                          В остальном разницы не вижу, перекрыл FreeInstance, пусть вызывает Free* из библиотеки...
                          Вот только увы, двоичная структура объекта может отличаться для разных версий Delphi, так что не все так просто.
                            Только я все-таки не понимаю, если нужно держать ссылку на метод другого класса, то что мешает напрямую это сделать? Ну по типу обработчика событий:
                            ExpandedWrap disabled
                              type
                                TFreeFunc = procedure(ObjToFree: TObject) of object;
                               
                                TFoo = class
                                ...
                                  FFreeFunc: TFreeFunc;
                                ...
                               
                              foo.FFreeFunc := some_obj.FreeFunc;
                              ...
                              //в FreeInstance:
                               FFreeFunc(Self);
                              http://www.embarcadero.com/products/delphi/64-bit
                              Порадуйтесь за нас :D
                                Круто. :rose: :birthday: :beer: Давно ждали?

                                Добавлено
                                Вы, кстати, можете нам вернуть. ;) Тоже всё дождаться не могли.
                                Сообщение отредактировано: Qraizer -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 166 167 [168] 169 170 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.2807 ]   [ 14 queries used ]   [ Generated: 31.07.26, 16:23 GMT ]