richtige Klasse finden
-
Hallo erstmal.
Feindlage:
Ich habe abgeleitet von einer Basisklasse zig (etwa 40) weitere Klassen, deren Inhalte ich speichern und laden kann. Jede Klasse ist natürlich spezifisch und behandelt die geladenen Daten unterschiedlich.Eigene Lage:
Ich bin ein Anfänger in C++ mit fundierten Kenntnissen in anderen Sprachen, sowie Assembler.Problem:
Wenn ich die Daten lade, bekomme ich anhand einer Typ-ID den Typ der Daten heraus. Nun will es mir aber nicht einfallen, wie daraus die richtige Klasse generieren könnte ohne, dass ich ne hässliche switch-Abfrage starte und jede gültige Typ-ID durchgehe.Eigener Lösungsansatz:
Ich dachte mir, dass ich Konstruktoren für jede Klasse baue und diese in einem Array abspeichere. Über den Index des Array würde ich dann die richtige Funktion bekommen, darüber ein initialisiertes Objekt der richtigen Klasse und alles wäre schön. Ich bekomme das nur nicht hin.Feindliche Sabotagetrupps:
Der Compiler meldet mir, dass ich keine Liste vom Typ Funktion erstellen kann. Selbst mit (void*) bin ich gescheitert.Antrag:
Kann mir jemand bei dem Problem helfen, oder eine andere vielleicht bessere Lösung zeigen?
-
du hast
class Base{...};
und
class Derived{...};
dann geht vielleicht auch
typedef Base* readAndCreateType(istream& in);
und
Base* readDerived(istream& in){
return new Derived(in);
}
und
readAndCreateType* arr[]={&readDerived};
und
Base* b=(*arr[0])(cin);
-
*hust*
Krass.An sowas muss ich mich erstmal gewöhnen. Vor allem, ich muss es erst einmal verstehen. Wenn ich es nicht blicke, melde ich mich nochmal.
Danke für die Hilfe.
/edit:
Was mir aufgefallen ist:
Sorry, ich hatte mich undeutlich ausgedrückt. Als ich Daten der Klasse meinte, meinte ich nicht deren Datenfelder, sondern z.B. die Textur, die sich dahinter verbirgt, oder die Soundfile, als Beispiel./edit2:
Wie kann ich es realisieren, dass sich die Module selbständig in z.B. einem solchen Array registrieren, ohne dass ich was am Hauptprogramm was ändern muss?/edit3: Ich habs jetzt verstanden, allerdings fehlt mir noch der Kick in die richtige Richtung was /edit2 angeht. Da will mir einfach keine Lösung einfallen.
-
Hellhound66 schrieb:
/edit2:
Wie kann ich es realisieren, dass sich die Module selbständig in z.B. einem solchen Array registrieren, ohne dass ich was am Hauptprogramm was ändern muss?vielleicht in der Derived.cpp
Derived::Derived(istream& in) :Base(in){ in>>posx; in>>posy; in>>name; } ... Base* readDerived(istream& in){ return new Derived(in); } //17 sei die id von Derived theReadfuntionsSetMeyersSingleton.get()[17]=&readDerived;Sorry, ich hatte mich undeutlich ausgedrückt. Als ich Daten der Klasse meinte, meinte ich nicht deren Datenfelder, sondern z.B. die Textur, die sich dahinter verbirgt, oder die Soundfile, als Beispiel.
oh. dafür braucht man meinen trick nicht. da geht doch ein schlichtes
class Galoppahue:public Base{ char const* getSoundFileName(){ //virtual in base return "data/sound/pferdWiehern.wav"; } }
-
theReadfuntionsSetMeyersSingleton.get()[17]=&readDerived;
Das verstehe ich nicht. Diese Zeile kann ich nicht außerhalb von main() aufrufen und wenn ich es in eine Funktion packe, muss ich diese wiederum in main() aufrufen. Ich hoffe, ihr versteht was ich meine.
Ich habe eine Includeliste, die so aussieht:
#include "base.h"
#include "CTexture.h"Nun möchte ich die Klassen erweitern, indem ich einfach nur die neue Klasse einbinde, ohne was in meinem Hauptprogramm ändern zu müssen:
#include "base.h"
#include "CTexture.h"
#include "CMap.h"In der fiktiven CMap.h soll alles soweit vorbereitet werden, dass aus Files geladene Maps über eine selbstprogrammierte Streamklasse die richtige (CMap) Klasse generieren.
Zitat:
Sorry, ich hatte mich undeutlich ausgedrückt. Als ich Daten der Klasse meinte, meinte ich nicht deren Datenfelder, sondern z.B. die Textur, die sich dahinter verbirgt, oder die Soundfile, als Beispiel.oh. dafür braucht man meinen trick nicht. da geht doch ein schlichtes
Eigentlich wollte ich damit meinen Aussagen mehr Klarheit verleihen, aber das war ein Schuß in den Ofen ^^. Natürlich brauche ich deinen Trick, der ist nämlich genau das was ich suchte. Ich wollte mit meiner Aussage nur ausgrenzen, dass irgendjemand denkt, ich wollte die Klasse selbst (also die Daten, die virtual table, usw.) speichern, sofern das überhaupt irgendwie geht.
P.S. Danke für die Anregung, die Daten an den Konstruktor der Klasse mittels einer Streamklasse zu bewerkstelligen. Das ist ne coole Idee. Sicherlich ein alter Hut, aber wie gesagt, ich lerne dass, was mir die Hilfe zeigt. Und das hatte ich noch nicht gefunden.