![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
object`ы в delphi 2009
просто так © (2008-10-13 21:08:00)Ктонибудь компилировал в D2009 проги использующие object`ы?
В конструкторе при вызове objsetup почемуто портятся поля объекта и походу указатель на vmt. далее при вызове любого виртуального метода AV.
Это глюк или так и надо?
Vga (2008-10-21 06:37:00) [1]
> Не понятно, чем они мешали CG.
Ничем не мешали, больше всего похоже что их случайно сломали.
GrayFace (2008-10-20 23:12:00) [2]Не понятно, о чем тут спорить. Ни одного довода в пользу удирания object'ов ведь не было. Не понятно, чем они мешали CG.
oxffff (2008-10-20 19:30:00) [3]
> просто так (20.10.08 17:40) [94]
Это ты о чем?
просто так (2008-10-20 17:40:00) [4]отсутствие возможности создать класс статически естественно как недостаток не рассматривается)?
oxffff (2008-10-20 17:21:00) [5]
> просто так (20.10.08 16:48) [92]
Я тебе пояснил преимущества новой объектной модели.
Мне то все понятно. :)
просто так (2008-10-20 16:48:00) [6]>>oxffff
>>Это возможно только для объектов кучи.
тебе религия запрещает объект в куче создать?
oxffff (2008-10-20 15:37:00) [7]
> просто так (20.10.08 12:04) [90]
> >>-Тем что нельзя сделать динамическое инстранцирование
А как ты собираешься делать динамическое создание на стеке?
Это возможно только для объектов кучи.
> можно
> >>-нельзя прикрутить интерфейсы к объекту
> это да
Следующее это то же самое. Проблема на том, что интерфейс должен существовать при выходе объекта из области видимости.
Это возможно только для объектов кучи.
> >>-нельзя прикрутить procedure of object.
> можно, прекрасно работает
Это возможно только для объектов кучи. Поскольку захватив метод объекта ты(это самое первое closure в delphi, еще до 2009) гарантировать время его жизни при выходе из scope.
Это возможно только для объектов кучи.
просто так (2008-10-20 12:04:00) [8]>>-Тем что нельзя сделать динамическое инстранцирование
можно
>>-нельзя прикрутить интерфейсы к объекту
это да
>>-нельзя прикрутить procedure of object.
можно, прекрасно работает
oxffff (2008-10-20 10:32:00) [9]
> просто так (20.10.08 10:20) [88]
Чем практичнее?
-Тем что нельзя сделать динамическое инстранцирование
-нельзя прикрутить интерфейсы к объекту
-нельзя прикрутить procedure of object.
Все это ограничение стекового размещения.
Или JAVA, .NET не по тому пути пошли?
просто так (2008-10-20 10:20:00) [10]>>Затем, что ввели другую идеалогию размещения объекта, в куче.
в обжекте легко реализовать что размещение в куче, что в стеке тут он практичнее.
>>В любом объекте (от class) уже есть виртуальные методы.
в object`е они есть только когда это надо програмисту, тоже имхо практичнее
oxffff (2008-10-20 09:34:00) [11]
> object без виртуальных методов - тоже, в нем нет вмт, тотже
> рекорд с методами, зачем херить старую провереную фичу и
> вводить новую аналогичную?
Затем, что ввели другую идеалогию размещения объекта, в куче.
> в delphi также. vmt появляется при первом виртуальном методе,
> по текущему смещению
В любом объекте (от class) уже есть виртуальные методы.
oxffff (2008-10-20 09:34:00) [12]
> object без виртуальных методов - тоже, в нем нет вмт, тотже
> рекорд с методами, зачем херить старую провереную фичу и
> вводить новую аналогичную?
Затем, что ввели другую идеалогию размещения объекта, в куче.
> в delphi также. vmt появляется при первом виртуальном методе,
> по текущему смещению
В любом объекте (от class) уже есть виртуальные методы.
просто так (2008-10-20 09:11:00) [13]>>А мы например очень это видим. Причина простая record - это конечный тип, который связан со всеми методами на момент компиляции
object без виртуальных методов - тоже, в нем нет вмт, тотже рекорд с методами, зачем херить старую провереную фичу и вводить новую аналогичную?
>>Проблема только одна - расположение VMT. В С++ VMT не обязательно хранится по нулевому смешению.
в delphi также. vmt появляется при первом виртуальном методе, по текущему смещению
oxffff (2008-10-20 08:43:00) [14]
> Если честно, я вообще не вижу причин, по которым нельзя
> сделать record-ы с VMT
А мы например очень это видим. Причина простая record - это конечный тип, который связан со всеми методами на момент компиляции. И смысл делать позднее связывание полностью отсутствует. :)
DevilDevil (2008-10-17 14:57:00) [15]> просто так (16.10.08 17:42) [53]
> а смысл доделывать рекорд? чтоб получить обжект который
> нафиг никому не нужен((?
object (или аналогичный ) нужен всем, только они ещё об этом не знают. Преимуществ record над object-ом невижу никаких! Преимущества objectа над record-ами: наследование, виртуальные методы, секции private/public/protected.
Если честно, я вообще не вижу причин, по которым нельзя сделать record-ы с VMT или продвигать object, а record оставить для обратной совместимости.
Проблема только одна - расположение VMT.
В С++ VMT не обязательно хранится по нулевому смешению.
Приведу аналоги на Delphi.
type
TMyPoint = object(TPoint)
public
function Length(): integer; virtual;
end;
Если реализовать то же самое в С++, то VMT будет по смещению 8байт. А вообще можно организовать так:
VMT
X: integer;
Y: integer;
И при вызове функции, где TMyPoint должен приводиться к TPoint:
var
MyPoint: TMyPoint;
begin
MyPoint.Create();
Windows.GetCursorPos(@MyPoint{!!!});
на уровне compiler magic должен пихаться указатель не на MyPoint, а на MyPoint+4. Вот и все проблемы.
Германн (2008-10-17 02:32:00) [16]
> просто так (17.10.08 01:56) [81]
>
> >>P.S. Пустопорожняя тема, а длится уже более трёх суток.
> И мой пост уже 80-й.
> Всем спасибо, тема закрыта
>
"Закрыть" тему может только модератор. А он пока не захотел её закрывать.
просто так (2008-10-17 01:56:00) [17]>>P.S. Пустопорожняя тема, а длится уже более трёх суток. И мой пост уже 80-й.
Всем спасибо, тема закрыта
Германн (2008-10-17 01:35:00) [18]
> просто так (17.10.08 00:35) [79]
>
> спсб, вроде заработало. но это тоже не выход((
>
А какой выход ты хотел бы? Волшебную палочку?
P.S. Пустопорожняя тема, а длится уже более трёх суток. И мой пост уже 80-й.
просто так (2008-10-17 00:35:00) [19]спсб, вроде заработало. но это тоже не выход((
oxffff (2008-10-16 23:53:00) [20]
> просто так (16.10.08 23:48) [76]
В итоге zguis.pas выглядит
type
zBase=object
procedure EmptyVirtual;virtual;
end;
zgui=object(zBase)
test:pointer;
procedure crash;virtual;
constructor create;
end;
implementation
procedure zgui.crash;
begin
test:=nil;
end;
constructor zgui.create;
begin
crash; //тут уже нет AV
end;
{ zBase }
procedure zBase.EmptyVirtual;
begin
//
end;