AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [OOP]: Instanzierung ohne Konstruktoraufruf
Thema durchsuchen
Ansicht
Themen-Optionen

[OOP]: Instanzierung ohne Konstruktoraufruf

Ein Thema von Gambit · begonnen am 4. Sep 2004 · letzter Beitrag vom 4. Sep 2004
Antwort Antwort
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#1

[OOP]: Instanzierung ohne Konstruktoraufruf

  Alt 4. Sep 2004, 11:09
Moin,

ich hab mir da mal ne ganz kleine Klasse geschrieben:

Delphi-Quellcode:
unit Unit2;

interface

type
  TMyClass = class(TObject)
    function add(a,b: Integer) :Integer;

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


implementation

function TMyClass.add(a,b: Integer) :Integer;
begin
  result:= a+b;
end;

end.
Soweit so gut. Folgende Form einer Anwendung verwendet dann diese Klasse:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    addiere:TMyClass;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  showMessage(IntToStr(addiere.add(1,6)));
end;

end.
Ich vestehe nicht, dass das so funktioniert, ich dachte immer, ich müsste zunächst ein Objekt der Klasse instanziieren, ehe ich damit arbeiten kann. Also irgendwie fehlt mit im obigen Code ein:
addiere:= TMyClass.create Kann mir da mal jemand OOP-mäßig auf die Sprünge helfen?

Gruß

Gambit
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Warum funzt dieser Code??

  Alt 4. Sep 2004, 11:12
Hi,

der Compiler prüft nicht, ob die Klasse bereits instanziert wurde.

In deinem Beispiel müsste der Zugriff auf "addiere" mit einer Zugriffsverletzung enden.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#3

Re: Warum funzt dieser Code??

  Alt 4. Sep 2004, 11:17
Zitat von mirage228:
In deinem Beispiel müsste der Zugriff auf "addiere" mit einer Zugriffsverletzung enden.
Das ist es ja, was ich nicht verstehe, es gibt keine Zugriffverletzung, das Programm funktioniert...

Gruß

Gambit
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#4

Re: Warum funzt dieser Code??

  Alt 4. Sep 2004, 11:18
Hallo,

alle Variablen die du verwendest gehören ja nicht zum Objekt - folglich kann er die Methode ohne Probleme abarbeiten. Wenn du noch ne Objekt-Variable c einführen würdest in der das Result zwischengespeichert werden soll, dann würde er auch rausfliegen.
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#5

Re: Warum funzt dieser Code??

  Alt 4. Sep 2004, 11:19
Zitat von mirage228:
In deinem Beispiel müsste der Zugriff auf "addiere" mit einer Zugriffsverletzung enden.
Das ist so nicht ganz korrekt.

Du hast bei einem Objekt immer zwei Teile:
Einen Teil, der nur die Daten hält. Für diesen Teil muss ein Speicherbereich reserviert werden, der später wieder freigegeben werden sollte (Objekt Instanzieren & Zerstören).

Daneben gibt es aber noch den Codebereich. Der ist zur Laufzeit des Programmes immer an der gleichen Stelle, und wird auch nicht pro Objekt abgelegt sondern nur einmal pro Klasse.

Da Deine Variable den Typ der Klasse hat, zeigen die Methoden der Klasse immer schon auf die richtige Stelle im Speicher.

Bei jedem Methodenaufruf wird aber zusätzlich die 'Self-Referenz' übergeben. Das ist ein Pointer auf den Datenbereich des jeweiligen konkreten Objektes, und wird dazu verwendet, die verweise auf z.B. Variablen in dem Objekt aufzulösen.

Bei Deinem Aufruf ist das Objekt nicht instanziert, die Self-Referenz ist also ungültig. Die Adresse der Methode selber nicht. Würdest Du nun versuchen, bei dem Aufruf auf eine Variable Deiner Klasse zuzugreifen, dann würde das nicht gehen, da Du aber keinen Teil aus dem Datenbereich benötigst, kann das Programm ohne auf einen nicht existenten Speicher zu benötigen problemlos weiterlaufen.


Nachtrag: Mift.. schon wieder zu langsam
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Warum funzt dieser Code??

  Alt 4. Sep 2004, 11:47
Stimmt, ihr habt recht.

Also verhält sich diese Funktion "Addiere" doch wie eine class function oder? (Nur das man sie nicht mit TMyClass.addiere aufrufen kann) - Richtig?

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:53 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