Mehrere Rückgabewerte bei einem Funktionsaufruf
-
Hallo Forum,
ich habe in letzter Zeit (seit 2002^^) leider nur in Scriptsprachen programmiert.
Aus diesem Grund ist mein c++ etwas eingerostet..Ich habe eine Sub-Klasse, in der ich eingegebene Commandos parsen will.
Beispielsweise übergebe ich einer Funktion der Subklasse einen StringINSERT data
,
extrahiere das Kommando (INSERT) und die Daten (data) und will beides
zurückgeben.Was ist dafür eine elegante (gängige) Lösung?
- Ich könnte Variablen übergeben, und diese in der Funktion abändern..
- Ich könnte ein Array definieren und das Array zurückgeben
- Oder eine Struktur definieren, diese in der Funktion übergeben.
- Es gibt eine bessere Lösung..
Man kann sich das wie ein einmaliges Kommando vorstellen (z.B. MySQL-, oder bconsole-Komando) welches geparst wird und anschliessend die Ergebnisse zurückgegeben werden.
Wie gesagt, mir wäre eine professionelle Methode recht.. Kann auch komplexer sein, so dass ich mich in die Lösung einarbeiten muss, aber gängig und elegant.
Ich wäre für Vorschläge/Lösungen dankbar, und danke euch auch im Voraus,
Gruss,
Toni.PS: Soweit ich mich erinnern kann hatte ich mich damals mit der selben (philosphischen) Frage geplagt.
-
tuner schrieb:
- Ich könnte Variablen übergeben, und diese in der Funktion abändern..
- Ich könnte ein Array definieren und das Array zurückgeben
- Oder eine Struktur definieren, diese in der Funktion übergeben.
- Es gibt eine bessere Lösung..
- Ist das üblichste, einfachste und flexibelste.
- Legt dich auf einen Typ bei den Rückgabewerten fest. Was machst du aber, wenn du einen String, einen int, oder gar eigene Typen verwenden willst?
Denkbar wäre jedoch eine Variant-Map/Liste. In den Variant kannst du beliebige Typen speichern. - Macht dich recht unflexibel, da du für jede x-beliebige Funktion nur wegen einem anderen Datentyp eine neue Struktur brauchst.
Also am besten sowas:
void func( const std::string& data, int* ret1, std::string* ret2, MyType* ret3 );
oder wenn Variants gehen:
std::list<Variant> func( const std::string& data );
-
Arrays kannst du nicht zurückgeben. Variants finde ich hier recht unangebracht.
Um in einem Rückgabewert mehrere Typen zu speichern, kann man eine eigene Klasse schreiben oder
std::pair
bzw.boost::tuple
verwenden.
-
Thx,
muss mir über die Möglichkeiten ein paar Gedanken machen^^
Jeden Falls Danke für die Antworten, wenn ich nicht weiterkomme, melde ich mich nochmal.
Gruss, Toni.
-
Ggfs. könntest Du den Container für die Rückgabewerte beim Aufruf per Referenz mitgeben.
void func( const std::string& data, std::list<Variant>& cmds )
-
Wieso überhaupt Variants? Diese werden eigentlich als moderne Version der
union
s eingesetzt - also wenn eine Variable mehrere Typen annehmen kann und man die gültigen Typen zur Compilezeit festlegt. Man hat hier nur unnötigen Overhead und sinnlose Funktionalität (das Zur-Laufzeit-Abändern), die missbraucht werden kann.Also ich sehe nach wie vor 3 elegante Möglichkeiten:
- Referenzparameter
- Eigene Klasse als Rückgabewert
- Klassentemplates
std::pair
undboost::tuple
. Haben den Vorteil, dass man nicht für jede kleine Typkombination eine eigene Klasse definieren muss und trotzdem den Rückgabetypen nutzen kann.