unterschiedliche objekttypen in einer liste speichern

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

unterschiedliche objekttypen in einer liste speichern

Beitrag von marvel »

hallo,
ich habe ein problem beim speichern meiner daten. ich habe 3 unterschiedliche klassen.

class a;
class b;
class c;

von jeder klasse existieren mehrere objekte. jetzt möchte ich bestimmte, erzeugte objekte in einer liste speichern. folglich würde die liste sowohl class a, class b als auch class c objekte speichern müssen. gibt es da eine lösung für ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn sie z.B. alle von ein und derselben Basisklasse abstammen. Oder die Pointer als void* speichern was nicht wirklich sinnig ist.
Aber wenn sie nicht von derselben Basisklasse abstammen ist es wohleher ein konzeptionelles Problem - was sollten sie denn dann zusammen in einem Container?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

ich habe klassen wie autobahn, bundesstraße, landstraße etc. stammen alle von der basisklasse infrastruktur ab. von jeder klasse werden mehrere objekte erzeugt. wollte diese alle in eine liste packen, aber habs jetzt ganz einfach gelöst indem ich für jeden objekttypen eine eigenen qhash erzeugt habe.

danke trotzdem
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

du kannst doch einfach alles in ne list<infrastruktur> meineListe packen!!!!
einfach versuchen die objekte auf infrastuktur zu casten. wenn es klappt dann in die liste, wenn nicht is iwo der wurm drin
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Beitrag von marvel »

ich habe vergessen zu erwähnen das die abgeleiteten objekte eigene funktionen haben und demnach sich voneinander unterscheiden. geht dann nicht mehr oder ?
drizzt
Beiträge: 29
Registriert: 9. Oktober 2009 13:37

Beitrag von drizzt »

doch, wie AuE geschrieben hast, musst du die casten

z.B.

Code: Alles auswählen

QList<Infrastruktur *> list;
[...]

Autobahn *ab = qobject_cast<Autobahn *>(list.at(0));
dann kannst du ab verwenden...
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

oder eben adersrum seichern. ... list.append( static_cast<infrastruktur *>(deinObjekt) )
Wo bei ich das noch aufdröeln würde da dir der Cde um die Ohren fliegen kann! Also eine NULL Prüfung ist angebracht
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Und dann kommen wir wieder zu der alten C++ regel:
Downcasts in Vererbungshirarchien weissen Immer auf Schwächen im Design hin !!!

Wenn du Klassen "sonderbehandelst" also die Dinge machst die du nur mit der Klasse machen kannst ... warum die dann in einen gemeinsamen Container pappen ???

Oftmals macht "man" sogar folgendes:

nehmen wir an Autobahn, Landstrasse, Bundesstrasse sind alle von IInfrastruktur abgeleitet.

Fuer das halten der Klassen hat man irgendwo im manager fuer jeden "Typ" eigene Listen ala std::list<Autobahn> mAutobahnList, std::list<Bundesstrasse> mBundesStrassenList .... usw.
Und fuer die, die mit allen Infrastrukturen arbeiten koennen, gibts ne std::list<IInfrastruktur *> mInfraStrukturList.

Sieht im ersten Moment umstaendlich aus, wird Dir aber auf dauer viel zeit und Aerger sparen ...

Sonderbehandlungen kann man aber im gewissen Masse auch eliminieren, nen guter Ansatzpunkt waere sich mit dem Besuchermuster zu beschaeftigen ...

Hasst du keine Sonderbehandlung mehr, kannst du generischer mit Objectfabriken usw arbeiten.

Wobei man Je nach Anwendungsfall die sache unterschiedlich streng nehmen sollt.
Fuer prototypen udn einmalige Apps die nur der eine entwickler zu sehen bekommt, iss nen downcast sicher ne option .
In Bibs, oder code den man veroeffentlich, isses aber eher nen "no go" !

Ciao ...
Zuletzt geändert von RHBaum am 18. Februar 2010 11:56, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Aber es macht in dem Fall absolut keinen Sinn, wenn in der verwaltenden Klasse schon klar ist, welche von Infrastruktur abgeleiteten Objekte in der Klasse verwaltet werden sollen. Da ist es viel schöner und einfacher, getrennte Listen zu verwalten. Nur weil man eine gemeinsame Basisklasse hat heißt das noch lange nicht, dass man im Container nur Basisklassenzeiger verwalten muss!

Wenn es sich um ein abstraktes Framework handelt, macht das aber sehr wohl Sinn! Siehe das Qt Graphics Framework. Es ist von Haus aus absolut NICHT absehbar, welche konkreten QGraphicsItems in die Scene gelangen, vor allem weil es dem User gestattet - und eigentlich auch von ihm gewünscht - ist, eigene abgeleitete Klassen in die Scene zu packen. Da geht eigentlich nichts über nen Basisklassen-Container.

BTW: Infrastruktur bezeichnet eigentlich das ganze Angebot an Straßen, Schienennetz usw. Eine Straße ist einfach keine Infrastruktur, Straßen gehören zur Infrastruktur!
Antworten