Delphi-PRAXiS

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

Mr_G 14. Mär 2009 10:22

Re: Zugriffsverletzung bei einem Constructor
 
Zitat:

Zitat von mkinzler
Man sollte sich trotzdem angewöhnen dies zu tun. Zudem kann sich die Implementierung bei TObject jederzeit ändern

Da stimme ich dir zur... Ich wollte nur erwähnen: Kein Regel ohne Ausnahme. Hinterher wundert sich Dragon27 noch warum sein Code funktioniert obwohl er etwas "falsch gemacht" hat. ;)

Dragon27 14. Mär 2009 10:34

Re: Zugriffsverletzung bei einem Constructor
 
Hallo Zusammen,

danke für die zahlreichen Antworten. Eines habe ich aber jetzt doch nicht verstanden....

Ich wollte 2 Constructoren machen. 1 Wenn das Konto schon besteht (aus einer Datei laden) und den anderen wenn das Konto komplett neu ist.
Das ganze habe ich mal so in meiner Schulzeit gelernt. Bin da jetzt ein wenig verwirrt... ;-)

Was den Fehler anbetrifft, der ist nun weg ;-) Habe tatsächlich das Crearte falsch aufgerufen ....

Danke!

Luckie 14. Mär 2009 10:37

Re: Zugriffsverletzung bei einem Constructor
 
Dann machts du zwei Konstruktoren und übelädst den standar Konstruktor.

mkinzler 14. Mär 2009 10:40

Re: Zugriffsverletzung bei einem Constructor
 
Mehrere Kostruktoren sind natürlich möglich. Man könnte es aber auch mit Parametern lösen

Muetze1 14. Mär 2009 15:29

Re: Zugriffsverletzung bei einem Constructor
 
Ich würde es noch anders lösen: Ein Standardkonstruktor, der alles so initialisiert als wenn es ein neues Konto ist. Dazu eine Methode um die Daten aus einer angegebenen Datei zu laden. Dann wäre der Weg immer über den Konstruktur - und nur bei bestehenden Konten zusätzlich über die Methode.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:29 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