Ich hab im zusammenhang mit Objektorientierte Progrmierung in Lazarus ein par Grundsatzfragen. Zu meinem Hintergrund: Bin selbst kein Softwareentwickler sondern eher so im Hobbybereich unterwegs. Habe aber Durchaus einge Programmiererfahrung mit Java; C#; sowie Python. Da ich für ein umfangreicheres Vorhaben eine "richtig" kompilierte sprache benötige und mir C/C++ zu unhandlich ist, habe ich mich an die Pascaleinführung aus der Schulzeit erinnert und bin so auf Lazarus gekommen. Da ich OOP im wesentlichen mit Java kennengelernt habe, liegt mein hauptproblem beim Thema Speicherverwaltung. Anbei daher eine kleine Beispielklasse mit 3 fragen und Bitte um Korrektur. Vielen Dank im Voraus!
1.) ist es zwingend nötig einen Destruktor zu implementieren
2.) Muss ich die erstellte Matrix instanz händisch bereinigen; oder wird der Speicher automatisch bereinigt wenn das Vertex-Objekt zerstört wird?
3.)Ich hab im wiki gelesen das man beim überladen von Konstruktoren immer die elternklasse beerben muss: https://de.wikibooks.org/wiki/Programmi ... struktoren
in meinem Fall hab ich das nicht gemacht. Die Klasse macht aber erstmal trotzdem was sie soll. Erzeuge ich hier ungewollte Probleme?
Code: Alles auswählen
unit vertex;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, matrix;
type
array3_Double = array[0..2] of double;
type
TVertex = class
private
vecData: Tvector4_double;
public
procedure convertToDirection();
procedure convertToPosition();
function toString(): string; overload;
constructor create(); overload;
constructor create(x,y,z: double); overload;
constructor create(inputArray: array3_Double); overload;
end;
implementation
// constructors
constructor TVertex.create();
begin
vecData.init_zero();
self.convertToPosition();
end;
constructor TVertex.create(x,y,z: double); overload;
begin
vecData.init(x,y,z,1);
end;
constructor TVertex.create(inputArray: array3_Double); overload;
begin
vecData.init(inputArray[0],
inputArray[1],
inputArray[2],
1)
end;
// functionality
procedure TVertex.convertToDirection();
begin
vecData.data[3]:= 0;
end;
procedure TVertex.convertToPosition();
begin
vecData.data[3]:= 1;
end;
function TVertex.toString(): string; overload;
begin
result := '[ ' + floatToStr(vecData.data[0]) + ' ]' + system.LineEnding
+ '[ ' + floatToStr(vecData.data[1]) + ' ]' + system.LineEnding
+ '[ ' + floatToStr(vecData.data[2]) + ' ]' + system.LineEnding
+ '[ ' + floatToStr(vecData.data[3]) + ' ]' + system.LineEnding;
end;
end.