Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

класс, который не нужно создавать.   Найти похожие ветки 

 
@!!ex ©   (2008-11-10 17:48) [0]

Можно ли както сделать, чтобы класс создавался и удалялся автоматически, без явного TClass.Create(); ?

тоесть:

TVector = class;

Обычно делаю так:
Function ();
var
 v:TVector;
begin
 v:=TVector.Create();
 v:=a+b;
 v.free();
end;


А хочется так:
Function ();
var
 v:TVector;
begin
 v:=a+b;
end;


 
clickmaker ©   (2008-11-10 17:50) [1]

> А хочется так:

переходи на С++ :)


 
@!!ex ©   (2008-11-10 19:17) [2]

Не актуально. Уже на С++.
Но есть проекты и на дельфи... вот и пытаюсь придумать что делать. :((


 
Джо ©   (2008-11-10 20:03) [3]

С созданием ничем не поможешь, нужно будет создавать :)
А с удалением проще — интерфейсы.


 
@!!ex ©   (2008-11-10 20:11) [4]

Собственно откуда желание.
Есть два типа TVector4f и TMatrix4x4f. Оба - рекорды.
Оба типа очень активно используются.
Матрица умеет усножать себя на вектор оператором.
Сейчас понадобилось научить вектор умножать себя на матрицу. Отсюда возникла проблема:
http://delphimaster.net/view/2-1226325610/

Вроде бы проблемы нет, если использовать класс вместо рекорда. Но!
Но вектора и матрицы разбросаны по всему коду.
Если я переделаю все на классы - придется везде бегать вставлять Create(); Free;
Отсюда:
1) Не факт что я где-то что-то не пропущу
2) Создавать и удалять явно часто используемые простые типы - это не совсем умно с точки зрения читабельности кода.


 
oxffff ©   (2008-11-10 21:08) [5]

TSomeClass<T: class,constructor> = record
 public
 class operator Implicit(const AValue: TSomeClass<T>): T;
 class operator Add(const AValue:TSomeClass<T>;AValue2:TSomeClass<T>): T;
 end;

class operator TSomeClass<T>.Implicit(const AValue: TSomeClass<T>): T;
begin
showmessage("Implicit cast");
Result:=T.create;
end;

class operator TSomeClass<T>.Add(const AValue:TSomeClass<T>;AValue2:TSomeClass<T>): T;
begin
showmessage("Binary op");
exit(T.create);
end;

procedure TForm2.FormCreate(Sender: TObject);
var a,b:TSomeClass<TObject>;
   c:Tobject;
begin
c:=a+b;
c:=a;
end;


 
@!!ex ©   (2008-11-10 21:25) [6]

> [5] oxffff ©   (10.11.08 21:08)

2009? :))
У меня TDE...


 
oxffff ©   (2008-11-10 21:26) [7]


> oxffff ©   (10.11.08 21:08) [5]


Усложняем задачу, делая автоматическое освобождение объектов.

Get Ready!!!

TDemoObject=class
procedure BeforeDestruction;override;
end;

TObjectHandle<T: class> = class(TInterfacedObject, TFunc<T>)
 private
   FValue: T;
 public
   constructor Create(AValue: T);
   destructor Destroy; override;
   function Invoke: T;
 end;

TSomeClass<T: class,constructor> = record
 public
 class operator Implicit(const AValue: TSomeClass<T>): TFunc<T>;
 class operator Add(const AValue:TSomeClass<T>;AValue2:TSomeClass<T>): TFunc<T>;
 end;

procedure TDemoObject.BeforeDestruction;
begin
showmessage("Этот пройдешь как дети в школу");
inherited;
end;

class operator TSomeClass<T>.Implicit(const AValue: TSomeClass<T>): TFunc<T>;
begin
showmessage("Implicit cast");
exit(TObjectHandle<T>.create(T.create));
end;

class operator TSomeClass<T>.Add(const AValue:TSomeClass<T>;AValue2:TSomeClass<T>): TFunc<T>;
begin
showmessage("Binary op");
exit(TObjectHandle<T>.create(T.create);
end;

procedure TForm2.FormCreate(Sender: TObject);
var a,b:TSomeClass<TDemoObject>;
   c:TFunc<TDemoObject>;
begin
c:=a+b;
c:=a;
end;

constructor TObjectHandle<T>.Create(AValue: T);
begin
 FValue := AValue;
end;

destructor TObjectHandle<T>.Destroy;
begin
 FValue.Free;
end;

function TObjectHandle<T>.Invoke: T;
begin
 Result := FValue;
end;


 
oxffff ©   (2008-11-10 21:30) [8]


> procedure TForm2.FormCreate(Sender: TObject);
> var a,b:TSomeClass<TDemoObject>;
>    c:TFunc<TDemoObject>;
> begin
> c:=a+b;
> c:=a;
> end;


Ну естественно можно С.Classname и т.д.


 
oxffff ©   (2008-11-10 22:48) [9]


> @!!ex ©   (10.11.08 21:25) [6]
> > [5] oxffff ©   (10.11.08 21:08)
>
> 2009? :))
> У меня TDE...


Переходи на 2009. См. [7].


 
jack128_   (2008-11-10 23:11) [10]


> TObjectHandle<T: class> = class(TInterfacedObject, TFunc<T>)

а что означает эта запись??

TFunc<T> объявлен вот так:
 TFunc<TResult> = reference to function: TResult;

что то не вьеду, как класс может наследоваться от анонимного метода??


 
@!!ex ©   (2008-11-11 00:11) [11]

> Переходи на 2009.

две штуки баксов на покупку не одолжите? :)))


 
Loginov Dmitry ©   (2008-11-11 00:19) [12]

может все-таки с .Create() будет проще?)))


 
oxffff ©   (2008-11-11 08:38) [13]


> jack128_   (10.11.08 23:11) [10]
>
> > TObjectHandle<T: class> = class(TInterfacedObject, TFunc<T>)
>
> а что означает эта запись??
>
> TFunc<T> объявлен вот так:
>  TFunc<TResult> = reference to function: TResult;
>
> что то не вьеду, как класс может наследоваться от анонимного
> метода??


Анонимный метод это интерфейс.


 
oxffff ©   (2008-11-11 08:43) [14]


> jack128_   (10.11.08 23:11) [10]


Если интересно историю можешь посмотреть мою переписку c Barry Kelly в его блоге.

Сначало было

http://barrkel.blogspot.com/2008/11/reference-counted-pointers-revisited.html

после переписки

Sergey Antonov aka oxffff said...
@Barry

perfectly, since anonymous method has Ref counting semantic and is used by outer consumer, there is no need in inner shared TSmartPointerController.
So we can remove 2 extra objects.

он предложил этот способ


> There was a little to and fro in the comments on yesterday"s
> post on more fluent smart pointers


http://barrkel.blogspot.com/2008/11/somewhat-more-efficient-smart-pointers.html


 
jack128_   (2008-11-11 18:32) [15]


> Анонимный метод это интерфейс.

Ха.  Блин, имхо - не правельно.  ТОчнее то что анонимные методы - как интефейсы реализованы - это понятно, но лично мне не ясно, нафиг эту внутреннюю кухню наружу выносить..


> он предложил этот способ

не сильно лудше его самого первого смарт поинтера, если чесно:
Новый вариант:
var
 Obj: TFunc<TObject>
begin
 Obj := THandleObject<TObject>.Create(TObject.Create);
end;


Старый вариант:
var
 Obj: TObject;
begin
 Obj := TSmatPointer<TObject>.Create(TObject.Create).Value;
end;


 
Правильный$Вася   (2008-11-11 18:47) [16]


> Есть два типа TVector4f и TMatrix4x4f. Оба - рекорды.Оба
> типа очень активно используются.Матрица умеет усножать себя
> на вектор оператором.Сейчас понадобилось научить вектор
> умножать себя на матрицу.

можешь сделать функцию, что мешает?


 
@!!ex ©   (2008-11-11 19:15) [17]

> [16] Правильный$Вася   (11.11.08 18:47)

Так и сделал.
Мешает то, что код превращается в свалку.

Сравните:
Function GetNormal(const v1,v2,v3:TVector4f):TVector4f;
begin
 Result:=(v2-v1)*(v3-v1);
 Result.Normalize();
end;

Function GetNormal(const v1,v2,v3:TVector4f):TVector4f;
begin
 Result:=Normalize(Cross(Sub(v2,v1),Sub(v3,v1));
end;


 
oxffff ©   (2008-11-11 19:24) [18]


> @!!ex ©   (11.11.08 19:15) [17]


А что перегрузка операторов не работает?


 
oxffff ©   (2008-11-11 19:29) [19]


> jack128_   (11.11.08 18:32) [15]
>
> > Анонимный метод это интерфейс.
>
> Ха.  Блин, имхо - не правельно.  ТОчнее то что анонимные
> методы - как интефейсы реализованы - это понятно, но лично
> мне не ясно, нафиг эту внутреннюю кухню наружу выносить.
> .


Что неправильно? То что захват происходит при помощи программиста.
Можешь использовать способ. Он там тоже в комментах озвучен.

procedure MyDestroy(obj:Tobject);
asm
push eax;
mov eax,[eax+12];
call Tobject.Free;
//No necessity for finalization, just Freemem
//And there is no valid RTTI for finalization
pop eax;
call System.@Freemem;
end;

const DestroySlot:pointer=@MyDestroy;

procedure PatchVMT(obj:Tobject);
asm
mov [eax],offset DestroySlot+4;
end;

class function TSmartPointerFromRussia"T".Wrap2(const AValue: T): TFunc"T";
begin
PatchVMT(Tobject(dword(@AValue)-12));
Result := function: T
begin
Result := AValue;
end;
end;


 
oxffff ©   (2008-11-11 19:30) [20]


> Можешь использовать способ.


Мой способ. ;)


 
@!!ex ©   (2008-11-11 19:56) [21]

> [18] oxffff ©   (11.11.08 19:24)

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


 
Slym ©   (2008-11-12 18:06) [22]

Опиши свои Variant типы (CustomVariant) получиш и астоубийство и создание и некоторые операции +-*/



Страницы: 1 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.02 c
10-1151524219
AlexeyT
2006-06-28 23:50
2008.12.21
WebBrowser: убрать предложение сохранить файл


15-1223942626
Германн
2008-10-14 04:03
2008.12.21
Из Паскаля в Си


15-1224484440
Slider007
2008-10-20 10:34
2008.12.21
С днем рождения ! 19 октября 2008 воскресенье


15-1223285577
Kerk
2008-10-06 13:32
2008.12.21
Письмо в кремль 2


2-1226161946
Надуев Алексей
2008-11-08 19:32
2008.12.21
WebBrowser