Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 166 167 [168] 169 170 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2506
,
|
|
|
|
Цитата jack128 @ D_KEY а. Ну тогда никаких принципиальных проблем для аналогичной реализации в дельфи - нет. Ну да, ясно. А такой вопрос, можно ли как-то указать, "удалителя" для объекта или все это сильно завязано на языковые механизмы управления памятью? Или в Delphi просто никогда не возникает необходимости работать со своими "менеджерами памяти" или "возвращать" объекты в другую среду(например, при взаимодействие с библиотекой, написанной на другом языке и предоставляющей функции для создания/удаления объектов)? |
|
Сообщ.
#2507
,
|
|
|
|
D_KEY
![]() ![]() TObject = class public ... class function NewInstance: TObject; virtual; procedure FreeInstance; virtual; end; можно перекрыть эти методы и выделять память под объекты как те угодно. Но для класса, доступа к сорцам которого у тебя нет, подсунуть свой менеджер памяти нельзя. Максимум - ты можешь подменить глобальный менеджер памяти, но тогда ты будешь выделять память под все что угодно (строки/дин массивы/объекты) и у тебя не будет возможности знать под что именно ты выделяешь память. |
|
Сообщ.
#2508
,
|
|
|
|
Цитата jack128 @ D_KEY ![]() ![]() TObject = class public ... class function NewInstance: TObject; virtual; procedure FreeInstance; virtual; end; можно перекрыть эти методы и выделять память под объекты как те угодно. Но для класса, доступа к сорцам которого у тебя нет, подсунуть свой менеджер памяти нельзя. Да, я помню. У нас примерно та же ситуация с перегрузкой new/delete. Другое дело, что shared_ptr'у(и не только) можно указать объект-функцию, которую он должен будет вызвать для удаления объекта. |
|
Сообщ.
#2509
,
|
|
|
|
Цитата D_KEY @ А такой вопрос, можно ли как-то указать, "удалителя" для объекта или все это сильно завязано на языковые механизмы управления памятью? Или в Delphi просто никогда не возникает необходимости работать со своими "менеджерами памяти" или "возвращать" объекты в другую среду(например, при взаимодействие с библиотекой, написанной на другом языке и предоставляющей функции для создания/удаления объектов)? ![]() ![]() class function NewInstance: TObject; virtual; procedure FreeInstance; virtual; По умолчанию там стандартные GetMem/FreeMem, перекрой - будет как хочется память выделяться. Но вот перекрытие для других менеджеров памяти - не встречал. Синглетон на этом делается. Добавлено Цитата D_KEY @ Другое дело, что shared_ptr'у(и не только) можно указать объект-функцию, которую он должен будет вызвать для удаления объекта. Хм... А если метод класса? |
|
Сообщ.
#2510
,
|
|
|
|
Цитата Romkin @ Забиндить можно. Хм... А если метод класса? |
|
Сообщ.
#2511
,
|
|
|
|
Цитата Romkin @ Цитата D_KEY @ Другое дело, что shared_ptr'у(и не только) можно указать объект-функцию, которую он должен будет вызвать для удаления объекта. Хм... А если метод класса? Объект функция - это любой объект с перегруженным operator()(обычную функцию также можно передать - она автоматически преобразуется в указатель на функцию). Кстати, лямбды из нового стандарта тоже подойдут. Да, ты можешь сказать, что нужно вызвать метод какого-то объекта |
|
Сообщ.
#2512
,
|
|
|
|
Цитата Повстанець @ Забиндить можно. Чего сделать? |
|
Сообщ.
#2513
,
|
|
|
|
Цитата Romkin @ Цитата Повстанець @ Забиндить можно. Чего сделать? ![]() Создать объект(написать лямбду или использоваться стандартные(или бустовые) классы для этого), который при вызове его operator() вызовет нужный метод у нужного объекта. |
|
Сообщ.
#2514
,
|
|
|
|
Цитата D_KEY @ Создать объект(написать лямбду или использоваться стандартные(или бустовые) классы для этого), который при вызове его operator() вызовет нужный метод у нужного объекта. Ээээ. А чем это отличается от перекрытия виртуального метода FreeInstance? С указанием внутри что дергать? Или это для каждого экземпляра индивидуально? Тогда поле, с обработчиком. |
|
Сообщ.
#2515
,
|
|
|
|
Цитата Romkin @ Ну так... чтоб понятно было:Чего сделать? ![]() ![]() ![]() 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 соответственно |
|
Сообщ.
#2516
,
|
|
|
|
Цитата Romkin @ Цитата D_KEY @ Создать объект(написать лямбду или использоваться стандартные(или бустовые) классы для этого), который при вызове его operator() вызовет нужный метод у нужного объекта. Ээээ. А чем это отличается от перекрытия виртуального метода FreeInstance? С указанием внутри что дергать? Или это для каждого экземпляра индивидуально? Тогда поле, с обработчиком. 1) Для каждого экземпляра можно индивидуально(кстати, объясни про поле и обработчика). 2) Можно вызывать совершенно произвольного "удалителя". 3) Можно взаимодействовать с библиотеками(например, Сишными(без ++), которые любят предоставлять функции вроде init*/free*). |
|
Сообщ.
#2517
,
|
|
|
|
Цитата Повстанець @ Ну так... чтоб понятно было: Спасибо. В Delphi если без выкрутасов, то либо лямбда, либо метод объекта или класса, т.е. просто функцию напрямую не присвоишь. ![]() ![]() 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 соответственно Что-то вроде ![]() ![]() 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, так что не все так просто. |
|
Сообщ.
#2518
,
|
|
|
|
Только я все-таки не понимаю, если нужно держать ссылку на метод другого класса, то что мешает напрямую это сделать? Ну по типу обработчика событий:
![]() ![]() type TFreeFunc = procedure(ObjToFree: TObject) of object; TFoo = class ... FFreeFunc: TFreeFunc; ... foo.FFreeFunc := some_obj.FreeFunc; ... //в FreeInstance: FFreeFunc(Self); |
|
Сообщ.
#2519
,
|
|
|
|
http://www.embarcadero.com/products/delphi/64-bit
Порадуйтесь за нас |
|
Сообщ.
#2520
,
|
|
|
|