Einzelnen Beitrag anzeigen

Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Versuche Objektorientierung zu lernen

  Alt 18. Feb 2012, 19:38
Ja die Fehlermeldung ist denke ich egal(da sie auch nichts hilfreiches aussagt)
Oh doch, sie sagt eine Menge aus. Lass mich raten: Der Compiler findet die Implementierung von TRechnen.calcit nicht? Und alle drei Konstruktoren auch nicht?
Die Glaskugel sagt "Forward declaration not solved: ....".

Zitat:
Außerdem würde ich mich freuen wenn mir jemand nocheinmal mit eigenen Worten den Sinn von inhirated und die genaue Funktionsweise des constructors erklären könnte. (Den constructor braucht man irgendwie um Speicher für die klasse zu reservieren und sie zu erstellen, was bedeutet dies genau? Und inherited ka wird halt manchmal auch hingeschrieben und manchmal nicht...)
inherited bedeutet, dass die gleichnamige Methode der Elternklasse aufgerufen wird. Man kann hinter das inherited auch noch den Methodennamen und die Parameterliste schreiben, falls sich eines von beiden von der aktuellen Methode unterscheidet.

Zum Konstruktor: Es gibt im Speicher einen bestimmten Bereich, der sich "Heap" nennt. Alle Klasseninstanzen werden dort erstellt. Der Heapspeicher ist aber nicht sofort für die Anwendung verfügbar, sondern er muss ihr erst vom Betriebssystem zugewiesen werden. Auf unterster Ebene geht das mit malloc() und realloc(), aber das ist eine ganz schöne Frickelei. Der Konstruktor nimmt dir das ein bisschen ab und besorgt den Speicher für dich. Das tut er schon in der Basisklasse TObject, also wenn du immer brav inherited benutzt*, musst du dich darum nicht groß kümmern und kannst den Konstruktor allein dafür benutzen, die Felder zu initialisieren.

Zitat:
PS.: Ich benutze Lazarus falls es da irgendetwas spezielles zu beachten gibt.
In der Hinsicht eigentlich nicht. Es gibt ein paar Dialektunterschiede, aber die liegen woanders. Und die Fehlermeldungen lauten eben etwas anders als bei Delphi.


Oh und noch was: In Unit1 rufst du Rechnen.Destroy direkt auf. Tu das nicht! Jetzt im Moment geht das vielleicht noch gut, aber wenn die Programme mal komplexer werden, kann das schon eine potentielle Fehlerquelle werden. Nimm stattdessen Rechnen.Free!



*) Bei Konstruktor und Destruktor werden sie auch automatisch ergänzt, wenn sie fehlen, von daher nicht allzu schlimm, wenn man sie dort vergisst.

Geändert von implementation (18. Feb 2012 um 19:46 Uhr)
  Mit Zitat antworten Zitat