Designfrage: Rückgabewert von Funktionen

Hallo,

mal eine Designfrage:

Ich habe eine Methode/Funktion die mir ein Objekt zurückgeben soll, z.B. CString.

Welche alternative ist denn da die beste?
A) CString myFunction();

mit folgendem Aufruf:

CString strRes = myFunction();

oder
B) void myFunction(CString *pStr);

mit folgendem Aufruf:

CString strRes;
myFunction(&strRes);

Wenn der Rückgabewert ein größeres Objekt, z.B. eine selbstgeschriebene Klasse ist, dann wohl B am besten?

Welche variante würdet Ihr bei dem Beispiel mit CString nehmen?
Gibt es da eigentlich eine Konvention (zB hinsichtlich Effizienz, Lesbarkeit, …)?

Vielen Dank für eine Antwort.
Gruß,
Tom

Hallo Thomas

Welche alternative ist denn da die beste?
A) CString myFunction();

CString strRes = myFunction();

B) void myFunction(CString *pStr);

CString strRes;
myFunction(&strRes);

Welche variante würdet Ihr bei dem Beispiel mit
CString nehmen?

Das kommt auf den Kontext an. Wenn
innerhalb eines Blocks „mal ein String“
gebraucht wird und Deine Funktion in
diesem Rahmen eingesetzt wird, dann A).

Wenn es eine Funktion werden soll, die
eher komplizierte Sachen mit über
mehrere Funktionen durchgereichte
Strings anstellt, dann B)

int myFunction(CString &pStr);

CString strRes;
int status = myFunction(strRes);

Eventuell auch eine Kombination aus A) und B),
wenn nämlich ein (nicht zu verändernder) Eingabe-
string in einen neuen Ausgabestring umgewandelt
werden soll:

CString myFunction( const CString &pStr);

CString strRes = „Konstanter Text“;
CString newStr = myFunction(strRes);

Gibt es da eigentlich eine Konvention (zB hinsichtlich
Effizienz, Lesbarkeit, …)?

Nein, das ist eine Kunst. Du entwickelst beim
Programmieren eine kohärente Ästhetik oder nicht :wink:

Grüße

CMБ

Hallo,

mal eine Designfrage:

Ich habe eine Methode/Funktion die mir ein Objekt zurückgeben
soll, z.B. CString.

Welche alternative ist denn da die beste?

Hallo Tom,

meiner Erfahrung nach (ich programmiere meistens in anderen Sprachen) ist das ja nicht beliebig - das Compiler-Handbuch sagt, was als Funktionsergebnis zulässig ist und was nicht. Das sind i.A. grosse, komplexe Strukturen. In C wird das etwas verwischt durch den Gebrauch von Pointern.

Generell würde ich niemals etwas zurückgeben, für das innerhalb der Funktion Speicherplatz reserviert wurde - der müsste dann ja ausserhalb zurückgegeben werden, was eine organisatorische Katastrophe ist und äusserst fehleranfällig. Ausnahmen sind natürlich Konstruktoren von Objekten, aber dann sollte auch ein Destruktor existieren.

Gruss Reinhard

Hallo Reinhard

Generell würde ich niemals etwas zurückgeben, für das
innerhalb der Funktion Speicherplatz reserviert wurde - der
müsste dann ja ausserhalb zurückgegeben werden, was eine
organisatorische Katastrophe ist und äusserst fehleranfällig.

Warte warte … nicht so vorschnell :wink:

Ausnahmen sind natürlich Konstruktoren von Objekten, aber dann
sollte auch ein Destruktor existieren.

Eben! Und deswegen wurde in C++ die Objekt-Idiomatik
eingeführt, bei dem sich ein Objekt beliebiger Art
über einen Destruktor sauber abmeldet, wenn es den
Sichtbarkeitsbereich verlässt.

Damit man Objekte, die auch Speicher dynamisch
reservieren können, wie normale Datentypen verwenden
kann.

Dachte ich zumindest …

Grüße

CMБ

Eben! Und deswegen wurde in C++ die Objekt-Idiomatik
eingeführt, bei dem sich ein Objekt beliebiger Art
über einen Destruktor sauber abmeldet, wenn es den
Sichtbarkeitsbereich verlässt.

Damit man Objekte, die auch Speicher dynamisch
reservieren können, wie normale Datentypen verwenden
kann.

Hallo Semjon,

du hast sicher recht, dass C++ den Programmierer von der Speicherverwaltung entlasten soll, aber da fehlt mir das 100%ige Vertrauen. Ich habe im Lauf der Jahre schon hunderte Berichte über Irregularitäten gelesen, ein grosser Teil der C+±Literatur besteht aus Kommentaren und Berichten, wann die automatische Speicherverwaltung eben nicht funktioniert. Allein diese unzähligen Ausnahmen machen mehr an notwendigem Wissen aus, als andere Programmiersprachen in ihrer Gesamtheit.

Grundsätzlich habe ich die Dinge lieber selbst in der Hand. Das mag auch daran liegen, dass ich mit nackter Maschinensprache angefangen habe und viel im Embeddedbereich gearbeitet habe. Meine erste NC-Steuerung hatte 256 Byte RAM, da muss man sich noch um jedes Bit persönlich kümmern.

Gruss Reinhard