Forum: Algorithmen, Datenstrukturen und Klassendesign
by uligerhardt,
24. Aug 2019
Dass man den ^ überhaupt manchmal weglassen darf, ist eh schon eine Krücke. Wo es dann zu uneindeutig wird, ist es halt ganz verboten.
Jo. Ich vermute mal, weil keine überflüssigen Speichereservierungen vorgenommen werden. Bei einem Interface kämen dann auch noch die virtuelle Methodenauflösung hinzu, wenn ich mich nicht täusche.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by uligerhardt,
24. Aug 2019
Schaut gut aus. Bzgl. des letzten Satzes: Du könntest dem Record einen Konstruktor oder eine Factory-Funktion verpassen. Dann solltest du so etwas schreiben können:
lDummy := ThsStr2.Create('dummy').CopyFromChar('-').CopyToChar('#'); // Mit Record-Konstruktor
// oder
lDummy := MakehsStr2('dummy').CopyFromChar('-').CopyToChar('#'); // Mit Factory-Funktion
Forum: Algorithmen, Datenstrukturen und Klassendesign
by uligerhardt,
24. Aug 2019
Sorry, ich hab's etwas kurz erklärt. :oops:
Du musst einen Zeigertyp zurückgeben, also etwas so:
type
PhsStr2 = ^ThsStr2; // Zeiger auf ThsStr2
ThsStr2 = record
FStr: string;
function AsString: string;
function Init(const mString: string): PhsStr2; // <== Beachte den Rückgabetyp!
end;
Forum: Algorithmen, Datenstrukturen und Klassendesign
by uligerhardt,
24. Aug 2019
Mit dem Haken siehst du halt, dass du dereferenzierst. Bei Variablen von Klassen- oder Interfacetypen dereferenzierst du genau so, nur ist es versteckt. De facto ist die zweite Variante also sogar weniger klar. :wink: (Vom erhöhten Overhead (dynamische Allozierung, virtuelle Methodenaufrufe) ganz zu schweigen.)
Forum: Algorithmen, Datenstrukturen und Klassendesign
by uligerhardt,
23. Aug 2019
Du könntest jeweils einen Zeiger auf Self zurückgeben. Also Result := @Self (mit Klammeraffe).
Da Delphi erlaubt, beim Dereferenzieren den ^ wegzulassen, könnten die Aufrufe sogar identisch ausschauen.
(Wobei ich dieses Feature persönlich verabscheue. Aber die Geschmäcker sind verschieden.)