Zum Inhalt springen

Listenfunktion mit verschiedenen Rückgabewerten


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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?

Geschrieben
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.

Geschrieben
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?

Geschrieben
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.

Geschrieben

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?

Geschrieben
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.
Geschrieben

@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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...