JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=65f8b1fefb3975f7c927e2d6800a19fbMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Vorgehen Liste mit verschiedenen Typen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 16.03.2007, 16:56    Titel: Vorgehen Liste mit verschiedenen Typen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 16.03.2007, 17:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 16.03.2007, 17:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 16.03.2007, 17:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 16.03.2007, 17:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 16.03.2007, 19:49    Titel: Antworten mit Zitat

@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 Wink
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 17.03.2007, 11:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 17.03.2007, 12:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 17.03.2007, 14:24    Titel: Antworten mit Zitat

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 Confused
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 17.03.2007, 15:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum