Article View: pl.comp.lang.pascal
Article #92324Re: operator -- i dziwny blad
From: Wiktor S.
Date: Sun, 16 Dec 2007 23:49
Date: Sun, 16 Dec 2007 23:49
129 lines
4395 bytes
4395 bytes
> operator :=(A:Test):String;
> begin
> Result := A.NumberToDexString;
> end;
> Memo.lines.Add('laczoney lancuch'+T+' ..');//zonk
> jak myslicie to blad kompilatora czy moj ??
Twój. w zapisie 'laczoney lancuch'+T+' ..' nie ma zastosowania operator :=
tylko +
:= jest stosowane tam, gdzie jest jawnie stosowane, albo następuje
przekazanie parametru z niezgodnym typem, np:
------------
procedure costam(s:string); begin {...} end;
var t:test;
costam(t);
------------
ponieważ w tym nawiasie wykonuje się s:=t (gdzie t:test, a s:string) to ma
zastosowanie twój operator.
Niestety, przy operatorach taka automatyczna konwersja nie jest dokonywana
(i jest to przekonywająco uzasadnione w helpie, chodzi o to by uniknąć
niejednoznacznych lub nadmiarowych konwersji).
Trzeba narobić operatorów, do każdej użytecznej kombinacji ;-)
operator +(a:test;b:string):string;
begin
result:=a.numbertodexstring+b;
end;
operator +(a:string;b:test):string;
begin
result:=a+b.numbertodexstring;
end;
operator +(a:test;b:test):string;
begin
result:=a.numbertodexstring+b.numbertodexstring;
end;
musisz zrobić wszystkie trzy przypadki, inaczej przy niektórych wyrażeniach
kompilator ci wyrzuci błąd.
Aha, i bardzo ważne: robisz operatory na klasach, więc pamiętaj o pułapce:
wystrzegaj się operatorów, które zwracają obiekt klasy, np:
-----------
operator +(a:test;b:test):test; // klasa jako wynik - niebezpieczne
begin
...
end;
-----------
taki operator musiałby tworzyć {poprzez .create()} swój wynik:
-----------
operator +(a:test;b:test):test;
begin
result.create;
...
end;
-----------
i testujemy:
-----------
var a,b,c:test;
a:=test.create;
b:=test.create;
c:=a+b;
{...}
a.free;
b.free;
c.free;
-----------
wewnątrz dodawania mamy niejawny konstruktor obiektu c. ALE:
-----------
var a,b,c,d:test;
a:=test.create;
b:=test.create;
c:=test.create;
d:=a+b+c;
{...}
-----------
i? i wszystko niby ok, tylko że podczas wykonywania działania utworzono
tymczasowy obiekt z wynikiem (a+b). Następnie kolejny z wynikiem (a+b)+c, i
ten właśnie jest zwracany jako d. A tamten pośredni? zgubiliśmy - powstał,
nigdy nie został zniszczony i zniszczony być nie już może, bo nie mamy na
niego żadnego wskaźnika. Mamy wyciek w pamięci - a gdyby taki kod (albo
mniej oczywisty, ale z tym samym efektem) pojawił się np. w pętli
wykonującej się 1000 razy na sekundę, posypanie programu gotowe.
Dlatego nie wolno pisać operatorów, w których tworzony jest jakikolwiek
obiekt klasy - bo nie będzie mógł być zniszczony.
Oznacza to, że odpadają operatory zwracające "class", co nas dość mocno
ogranicza. Ale możemy:
- dowoli używać operatorów w przypadku tablic i rekordów (oczywiście jeżeli
nie zawierają klas w sobie)
- dowoli używać operatorów w przypadku obiektów typu "object" (zamiast
"class"). są one przekazywane przez wartość (jak rekordy) i efekt wycieku
pamięci nie wystąpi, ale "object" nie obsługują właściwości (property).
- jeżeli już koniecznie potrzebujesz klasy typu "class", to musisz utworzyć
dodatkowy typ interfejsowy (interface), a klasę dziedziczyć po
TIterfacedObject. Da ci to automagiczne wywoływanie destruktora na takim
tymczasowym obiekcie, jak wyżej opisałem. Jeśli chcesz szczegółów, służę
pomocą ;-)
--
Azarien
Technical Details
Message-ID:
<fk4dhi$odd$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mailReferences:
<798c.000001a1.47640547@newsgate.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail From: "Wiktor S." <wswiktor&poczta,fm@no.spam> Newsgroups: pl.comp.lang.pascal Subject: Re: operator -- i dziwny blad Date: Mon, 17 Dec 2007 00:49:27 +0100 Organization: Onet.pl Lines: 136 Message-ID: <fk4dhi$odd$1@news.onet.pl> References: <798c.000001a1.47640547@newsgate.onet.pl> NNTP-Posting-Host: 76.174.wmc.com.pl Mime-Version: 1.0 X-Trace: news.onet.pl 1197848946 25005 87.250.174.76 (16 Dec 2007 23:49:06 GMT) X-Complaints-To: usenet@news.onet.pl NNTP-Posting-Date: Sun, 16 Dec 2007 23:49:06 +0000 (UTC) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 X-Sender: 63e3folRCjcGWUjNfLSN0w== X-Newsreader: Microsoft Outlook Express 6.00.2900.3138 X-Priority: 3 X-MSMail-Priority: Normal Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit