Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung bei einem Constructor (https://www.delphipraxis.net/130851-zugriffsverletzung-bei-einem-constructor.html)

Dragon27 14. Mär 2009 09:53


Zugriffsverletzung bei einem Constructor
 
Hallo Zusammen,

ich habe gerade eine neue Klasse geschrieben, jedoch wird mir beim Constructor eine Zugriffsverletzung angezeigt. Weiß
jemand von Euch wieso?

Delphi-Quellcode:
type TKonto = class
     BeschEinnahmen:TStringlist;
     GeldEinnahmen:Tstringlist;
     BeschAusgaben:Tstringlist;
     GeldAusgaben:Tstringlist;
     KName:String;
  public

     Procedure Add(Art:String;Besch:String;Geld:String);
     Procedure Delete(Art:String;Index:Integer);
     Function CalcSaldo():String;
     Constructor NeuesKonto(NKName:string);
     Destructor KontoOhneSpeichernBeenden;
end;

implementation

Destructor TKonto.KontoOhneSpeichernBeenden;
begin
  BeschEinnahmen.Free;
  GeldEinnahmen.Free;
  BeschAusgaben.Free;
  GeldAusgaben.Free;
end;

Constructor TKonto.NeuesKonto(NKName:string);
begin
  BeschEinnahmen:=Tstringlist.Create; //Hier ist der Fehler
  GeldEinnahmen:=Tstringlist.Create;
  BeschAusgaben:=Tstringlist.Create;
  GeldAusgaben:=Tstringlist.Create;
  KName:=NKName;
end;
Danke!

jaenicke 14. Mär 2009 09:56

Re: Zugriffsverletzung bei einem Constructor
 
Was den Fehler anbelangt vermute ich, dass du das so aufrufst:
Delphi-Quellcode:
var
  xy: TKonto;
begin
  xy.NeuesKonto(...);
statt richtig
Delphi-Quellcode:
var
  xy: TKonto;
begin
  xy := TKonto.NeuesKonto(...);
xy existiert ja da noch nicht, und du versuchst trotzdem eine Methode daraus aufzurufen.

Dann zu dem Namen: Ein Konstruktor heißt Create und nicht NeuesKonto und der Destruktor Destroy...

Mr_G 14. Mär 2009 10:03

Re: Zugriffsverletzung bei einem Constructor
 
Zitat:

Zitat von jaenicke
Dann zu dem Namen: Ein Konstruktor heißt Create und nicht NeuesKonto und der Destruktor Destroy...

Das liegt bei einem selbst (wie man sieht ;)).

mkinzler 14. Mär 2009 10:03

Re: Zugriffsverletzung bei einem Constructor
 
Zudem muss man im Konstruktor den geerbeten aufrufen

also als ersten Befehl
Delphi-Quellcode:
inherited Create(<Parameterliste>);

Luckie 14. Mär 2009 10:06

Re: Zugriffsverletzung bei einem Constructor
 
Wenn die Klasse von TObject abgeleitet ist, ist dies überflüssig, da der Konstrukor von TObject leer ist.

Mr_G 14. Mär 2009 10:08

Re: Zugriffsverletzung bei einem Constructor
 
Zitat:

Zitat von mkinzler
Zudem muss man im Konstruktor den geerbeten aufrufen

Laut OH scheint es auch da Ausnahmen zu geben:
Zitat:

Beim Aufruf mit einer Objektreferenz wird normalerweise der geerbte Konstruktor mit inherited ausgeführt.

jaenicke 14. Mär 2009 10:08

Re: Zugriffsverletzung bei einem Constructor
 
Zitat:

Zitat von Mr_G
Zitat:

Zitat von jaenicke
Dann zu dem Namen: Ein Konstruktor heißt Create und nicht NeuesKonto und der Destruktor Destroy...

Das liegt bei einem selbst (wie man sieht ;)).

Den einzigen Sinn, den ich sehe, ist, wenn man die benutzenden Programmierer ärgern möchte...

mkinzler 14. Mär 2009 10:12

Re: Zugriffsverletzung bei einem Constructor
 
Zitat:

Beim Aufruf mit einer Objektreferenz wird normalerweise der geerbte Konstruktor mit inherited ausgeführt.
Ist keine Ausnahme. inherited; bewirkst das der Konstruktor der Superklasse mit dem selben Namen und der identischen Parameterliste aufgerufen wird.

Mr_G 14. Mär 2009 10:15

Re: Zugriffsverletzung bei einem Constructor
 
@jaenicke: Da Delphi oft zu Ausbildungszwecken benutzt wird, gehen viele nicht unbedingt auf die "sprachspezifischen Besonderheiten" ein sondern nutzen das was sie als "sprechende Namen" empfinden.

@mkinzler: Wie passt den Luckies Statement da rein?

mkinzler 14. Mär 2009 10:19

Re: Zugriffsverletzung bei einem Constructor
 
Zitat:

@mkinzler: Wie passt den Luckies Statement da rein?
Man sollte sich trotzdem angewöhnen dies zu tun. Zudem kann sich die Implementierung bei TObject jederzeit ändern


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 Uhr.
Seite 1 von 2  1 2      

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