Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

object`ы в delphi 2009


Страницы:   1 2 3 4 5

просто так ©   (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;


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо