PL1994 Geschrieben 17. September 2014 Geschrieben 17. September 2014 Hallo, ich möchte eine Funktion schreiben, die nach einer bestimmten Fallunterscheidung entweder eine Liste der Klasse A oder B zurückgibt. A und B erben nicht von einer gemeinsamen Basisklasse. Das sollte dann etwa so aussehen: std::list<???> get(bool { if( { std::list<A> alist; // Liste füllen ... return alist; } else { std::list<B> blist; // Liste füllen ... return blist; } } [/code] Was setze ich jetzt bei "???" ein? Gruß PL1994 Zitieren
Klotzkopp Geschrieben 17. September 2014 Geschrieben 17. September 2014 Selbst wenn das irgendwie gehen würde, wie würdest du den Rückgabewert denn verwenden wollen? Zitieren
PL1994 Geschrieben 17. September 2014 Autor Geschrieben 17. September 2014 Also die Liste, die zurückgegeben wird, soll jeweils die Datensätze einer Tabelle aus einer Datenbank enthalten, die durch verschiedene Klassen repräsentiert werden. Auf diese Weise hätte ich eine Funktion für alle Tabellen, sonst müsste ich pro Tabelle eine Funktion zur Verfügung stellen. Zitieren
Klotzkopp Geschrieben 17. September 2014 Geschrieben 17. September 2014 Ich meinte, wie stellst du dir das konkret im Code vor? Was machst du mit den Listen? Hast du ein Stück Code, das sowohl mit A als auch mit B zurechtkommt, oder musst du irgendwann doch wieder jede Tabelle für sich behandeln? Man kann da mit Templates durchaus etwas basteln, aber wenn am Ende doch alles nur wieder über eine if-Kaskade nach dem konkreten Typ aufgedröselt wird, kann man sich das sparen. Zitieren
PL1994 Geschrieben 17. September 2014 Autor Geschrieben 17. September 2014 Aufdröseln muss ich nie wieder etwas, ich bekomme ja immer nur eine Liste zurück. Beim Abruf der Listen ist der einzige Unterschied, dass ich entweder verschiedene Funktionen oder immer eine mit verschiedenen Parametern aufrufe - ziemlich egal an der Stelle. Mir geht es nur darum, dass eine einzelne Funktion weniger Quellcode bedeutet und mir effizienter erscheint. Würde es dafür Sinn machen, Templates zu verwenden, oder lohnt sich das nicht, wenn man als Vorteil nur kürzeren Code erreichen will? Zitieren
Guybrush Threepwood Geschrieben 17. September 2014 Geschrieben 17. September 2014 Aufdröseln muss ich nie wieder etwas, ich bekomme ja immer nur eine Liste zurück. Beim Abruf der Listen ist der einzige Unterschied, dass ich entweder verschiedene Funktionen oder immer eine mit verschiedenen Parametern aufrufe - ziemlich egal an der Stelle. Ich glaube du hast die Frage von Klotzkopp nicht ganz verstanden. Entweder Klasse A und B haben unterschiedliche Attribute und Methoden, dann müsstest immer überprüfen was für ein Objekt da jetzt in deiner Liste steckt um darauf zuzugreifen -> du gewinnst nichts dadurch das zu vermengen Oder Klasse A und B haben die selben Attribute und Methoden, dann sollten sie einen gemeinsamen Basistypen haben welchen du auch in der Liste verwenden kannst. Zitieren
Klotzkopp Geschrieben 17. September 2014 Geschrieben 17. September 2014 Aufdröseln muss ich nie wieder etwas, ich bekomme ja immer nur eine Liste zurück.Was machst du denn mit den Listen? Oder holst du die nur zum Spaß ab? Sagen wir mal, du hast da ein ListOfEither<A,B> x = get(some_bool); Was passiert jetzt mit x oder den Elementen darin? Zitieren
PL1994 Geschrieben 17. September 2014 Autor Geschrieben 17. September 2014 Letztendlich sollen die Elemente immer in irgendeiner Weise graphisch dargestellt werden. Mehr passiert damit nicht mehr. Zitieren
Klotzkopp Geschrieben 17. September 2014 Geschrieben 17. September 2014 Letztendlich sollen die Elemente immer in irgendeiner Weise graphisch dargestellt werden. Wenn du so unspezifisch bleibst, kann man auch nur unspezifisch helfen. Lass get eine Struktur zurückgeben, die sowohl eine list<A> als auch eine list<B> enthält, z.B. mit std::tuple. Zitieren
PL1994 Geschrieben 18. September 2014 Autor Geschrieben 18. September 2014 Ich versuche es etwas spezifischer (Ich würde ja Code posten, aber das meiste davon existiert noch nicht ): Die Daten einer Liste sollen in einer Combobox dargestellt werden, andere als Tabelle. Sie werden an unterschiedlicher Stelle im Programm abgerufen und nicht mehr verändert (Es wird höchstens etwas direkt in der Datenbank verändert und die Liste dann neu abgerufen). Der Vorschlag mit dem Tuple würde funktionieren, aber da die Funktion immer nur eine Liste zurückgeben soll, wären die anderen Positionen leer oder würden "Dummy-Listen" enthalten, die nicht gebraucht würden. Gibt es vielleicht einen anderen Datentyp als die Liste, der sich besser eignen würde und weniger streng typisiert ist, sodass ich die Elemente erst nach dem Auslesen zu den gewünschten Klassen casten könnte? Zitieren
Hexagon Geschrieben 18. September 2014 Geschrieben 18. September 2014 Die Daten einer Liste sollen in einer Combobox dargestellt werden, andere als Tabelle. Sind das alles Strings? Zitieren
Klotzkopp Geschrieben 18. September 2014 Geschrieben 18. September 2014 Gibt es vielleicht einen anderen Datentyp als die Liste, der sich besser eignen würde und weniger streng typisiert ist, sodass ich die Elemente erst nach dem Auslesen zu den gewünschten Klassen casten könnte?Schau dir boost::variant und boost::any an. Zitieren
PL1994 Geschrieben 18. September 2014 Autor Geschrieben 18. September 2014 @Klotzkopp Das scheint mir genau das Richtige zu sein, danke! Muss es natürlich erst noch probieren, aber ich schätze, das geht! Und der Vollständigkeit halber @Hexagon Alles, was nachher in der Combobox sein soll, ist vom Typ String. Diese sind eine Eigenschaft der Klassen in der Liste. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.