AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

eine Klasse als Rückgabewert??

Ein Thema von chaoslion · begonnen am 4. Mär 2007 · letzter Beitrag vom 6. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
chaoslion

Registriert seit: 1. Mär 2006
52 Beiträge
 
#1

eine Klasse als Rückgabewert??

  Alt 4. Mär 2007, 20:48
Hey

ich hab ne Klasse:

Delphi-Quellcode:
type vector = class
public
 x,y: integer;
 function add(v:vector): vector;
end;


..

function vector.add(v:vector): vector;
begin
// wie mache ich das hier?
end;

wie gebe ich jetzt eine vector klasse zurück, die ich ja erst erstellen müsste mit vector.create aber wo gebe ich dann den speicher wieder
frei? wie macht man das?
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#2

Re: eine Klasse als Rückgabetyp??

  Alt 4. Mär 2007, 20:56
Lass den Nutzer deiner Funktion das ganze erledigen:

Delphi-Quellcode:
procedure vector.add(v : Vector; var ResultVector : Vector);
begin
...
ResultVektor := <Irgendwas>;
end;
//Edit:
Er muss dann vor dem Aufruf der Funktion ein Vektorobjekt erstellen und dies später auch wieder freigeben:

Delphi-Quellcode:
Var Result : Vector;
...
  Result := Vector.Create();

  v.add(u,Result);
  
  Result.Free;
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: eine Klasse als Rückgabetyp??

  Alt 4. Mär 2007, 20:58
Ja, du kannst si in dieser add-funktion erstellen und später wieder freigen, wenn du sie in der aufrufenden funktion nicht mehr benötigst.
Wie dir ja auch aufgefallen ist, führt dies leicht zu Fehlern. Eine Alternative wäre die Klasse nicht als Funktionsergebnis zurückzugeben sondern sie als Parameter zu übergeben:
Delphi-Quellcode:
procedure add(v:vector;const to_add:vector);
begin
  to_add.dosomething;
end;
...

my_vector:=Tvector.create;
add(v,my_vector);
...
my_vector.free;
Damit hast du dann die Kontroll über den Speicher der Klasse an einer Stelle. aber sehe ies nur als Alternative. Es ist nicht immer möglich.


Roter Kaste: Ich habe mehr geschrieben
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: eine Klasse als Rückgabewert??

  Alt 4. Mär 2007, 23:08
@leddl: Warum wird der Result Vektor als VAR deklariert und nicht als konstant? Schliesslich wird doch in der Funktion keine neue Instanz erzeugt oder dem Result Vektor zugewiesen. Beide Parameter können/sollten Const sein.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#5

Re: eine Klasse als Rückgabewert??

  Alt 5. Mär 2007, 01:46
Die IMHO schönere Lösung ist es eine Interface-Referenz zurückzugeben.
Dann wird der Speicher automatisch freigegeben wenn du die Referenz nicht mehr benutzt.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#6

Re: eine Klasse als Rückgabewert??

  Alt 5. Mär 2007, 07:02
Du könntest auch den constructor überladen, dann ist wenigstens eindeutig, dass du ein neues Objekt zurückbekommst, dass du wieder freigeben musst.

Wenn du einen Parameter nicht mehr brauchst, wäre ich aber eher dafür du schreibst die Vektor-Klasse um und änderst die add-Funktion hinzu so, dass sie sich selbst modifiziert, statt eine geänderte Kopie von sich selbst.
Delphi-Quellcode:
procedure Vector.add(other: Vector);
begin
  x :=x+ other.x;
  y :=y+ other.y;
end;
Wenn du dann mal wirklich eine Kopie brauchst und den Parameter behalöten willst, dann klone das Objekt eben vorher.
Diese Lösung ist nicht nur übersichtlicher, sondern sollte auch performancetechnisch vorne liegen.
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#7

Re: eine Klasse als Rückgabewert??

  Alt 5. Mär 2007, 10:13
Zitat von yankee:
Diese Lösung ist nicht nur übersichtlicher, sondern sollte auch performancetechnisch vorne liegen.
Hmpf? Jetzt soll jeder Code plötzlich direkt mit der Klasse des Rückgabewertes verwoben werden?
Wo's 'n das übersichtlich und was hat es mit Performance zu tun ob ich Code im Constructor oder außerhalb platziere?
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#8

Re: eine Klasse als Rückgabewert??

  Alt 5. Mär 2007, 15:17
Zitat von Elvis:
Wo's 'n das übersichtlich und was hat es mit Performance zu tun ob ich Code im Constructor oder außerhalb platziere?
Nix constructor...
Nix neue Klasse instanzieren.
Ich meinte, du sollst die bestehende Klasse abändern anstatt eine neue zu instanzieren...
DAS geht schneller, welch du... eben keinen neuen RAM ziehen musst und den Konstrukor nicht neu ziehen musst und dir einen Free-Aufruf sparst.
Das ganze hilft dir natürlich nur begrentzt, wenn due den alten Parameter brauchst. Aber selbst da würde ich es für übersichtlicher halten.
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
LarsMiddendorf

Registriert seit: 4. Sep 2003
Ort: Hemer
104 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: eine Klasse als Rückgabewert??

  Alt 5. Mär 2007, 16:09
Warum in diesem Fall keinen record nehmen? Das ist bei einem Vektor eh sinnvoller und man kann Operatoren überladen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: eine Klasse als Rückgabewert??

  Alt 5. Mär 2007, 16:10
Zitat von LarsMiddendorf:
Warum in diesem Fall keinen record nehmen? Das ist bei einem Vektor eh sinnvoller und man kann Operatoren überladen.
Aber erst ab D10 (BDS2006/TD für Win32)
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz