Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 16.03.2007, 16:56 Titel: Vorgehen Liste mit verschiedenen Typen |
|
|
Hey,
bei mir tritt der Fall ein, dass ich eine Liste (z.B. std::list oder auch std::vector) besitze, die ich mit Objekten verschiedenen Typs füllen möchte.
Mir fallen folgende Möglichkeiten ein:
1.) Die Liste mit Pointern füllen, aber wie kann ich die Pointer in ein einheitliches Format bringen ? Einfach casten ?
2.) Einen Manager schreiben, der für jeden Typ eine einzelne Liste erstellt, und sich zusätzlich die Reihenfolge merkt.
3.) Alle Typen von einer Grundklasse ableiten, und diese Grundklasse n der Liste speichern ... (nicht gut ^^)
Wie würdet ihr vorgehen? Ich bin ja für die erste Variante, bin mir aber nicht sicher, ob das sauber ist. _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 16.03.2007, 17:08 Titel: |
|
|
Also für 1. Musst du einfach eine Liste von Void-Pointern nutzen.
Ist wegen der Typunsicherheit aber nicht zu empfehlen.
2. Ist unsinn,
3. wäre Prinzipiell der beste Weg - sofern sich die Typen nicht zu sehr voneinander unterscheiden - bzw. der Grundtyp "Resource" wäre.
Ansonsten würde mir noch folgendes einfallen:
CPP: | enum ResType {
Textur,
Mesh,
Soundfile,
BinaryData
}
struct TagResource {
ResType Type;
void* Pointer
} Resource;
|
_________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 16.03.2007, 17:15 Titel: |
|
|
Bei deinem Variante benutzt du Variante 1, stellst aber sicher um welchen Typ es sich handelt oder ?
Leider unterscheiden sich die Type schon relativ stark, weshalb ich nur ungern zu Möglichkeit 3 greifen würde. _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Dragon Super JLI'ler

Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 16.03.2007, 17:34 Titel: |
|
|
Mach eine Klasse Unknown oder so. Dann leitest du alle Klassen von dieser ab. In deiner Liste speicherst du dann die Zeiger vom Typ Unknown. Kannst natürlich auch einen sinnvolleren Namen verwenden als Unknown. Also nach deiner Liste wäre es drittens. Warum sollte das nicht gut sein? Verstehe ich nicht. _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 16.03.2007, 17:58 Titel: |
|
|
http://www.boost.org/doc/html/variant.html
Mit Hilfe von discriminated unions und dem visitor pattern sehr sauber und typsicher umgesetzt. _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 16.03.2007, 19:49 Titel: |
|
|
@Dragon:
Das mit dem Ableiten gefällt mir deshalb nicht, weil wirklich viele verschiedene Klassen in den Container sollen. Diese dann alle von einem Typ abzuleiten, der jediglich zur Abspeicherung dient ist nicht wirklich Sinn einer Ableitung.
Außerdem: Wenn man eh den Zeiger benutzt, braucht man ja auch keinen einheitlichen Basistyp mehr.
@Kampfhund:
Die "discriminated unions" sehen wirklich viel versprechend aus. Ich denke mit denen (evtl. mit Zeigern wenn es Probleme geben sollte) werde ich es lösen.
Danke  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 17.03.2007, 11:04 Titel: |
|
|
Mat hat Folgendes geschrieben: | @Dragon:
Das mit dem Ableiten gefällt mir deshalb nicht, weil wirklich viele verschiedene Klassen in den Container sollen. Diese dann alle von einem Typ abzuleiten, der jediglich zur Abspeicherung dient ist nicht wirklich Sinn einer Ableitung.
Außerdem: Wenn man eh den Zeiger benutzt, braucht man ja auch keinen einheitlichen Basistyp mehr.
|
Wozu speichert man verschiedene Objekte ohne Zusammenhang in einem Container? Normalerweise tut man sowas nur wenn sie gemeinsame funktionen/etc haben die abstrakt aufgerufen werden können. |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 17.03.2007, 12:43 Titel: |
|
|
Ja, du solltest wenn du sowas brauchst nochmal gut drübernachdenken, ob du nicht einen Designfehler gemacht hast. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 17.03.2007, 14:24 Titel: |
|
|
Hmm ... ich denke gerde über die Gemeinsamkeiten nach, diese bestehen teils zwar nur im Ansatz, sind aber schon logisch zusammen hängend.
Vermutlich ist es wirklich besser wenn ich das Application-Design nochmal überdenke.
Das ist mir alles nicht so geheuer  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 17.03.2007, 15:28 Titel: |
|
|
Nimm doch boost::any.
CPP: | #include <iostream>
#include <vector>
#include <string>
#include <boost/any.hpp>
int main()
{
std::vector< boost::any > container;
container.push_back( 10 );
container.push_back( std::string( "Hallo Welt" ) );
try
{
std::cout << boost::any_cast< int >( container[ 0 ] );
std::cout << boost::any_cast< std::string >( container[ 1 ] );
}
catch ( const boost::bad_any_cast& )
{}
std::cin.get();
}
|
|
|
Nach oben |
|
 |
|