unterschiedliche objekttypen in einer liste speichern
unterschiedliche objekttypen in einer liste speichern
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 ?
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:
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?
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
'Funktioniert nicht' ist keine Fehlerbeschreibung
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
danke trotzdem
doch, wie AuE geschrieben hast, musst du die casten
z.B.
dann kannst du ab verwenden...
z.B.
Code: Alles auswählen
QList<Infrastruktur *> list;
[...]
Autobahn *ab = qobject_cast<Autobahn *>(list.at(0));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 ...
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.
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!
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!