Instanz erstellen, ohne Klasse zu kennen
-
Hi,
folgendes:
Gibt es eine Möglichkeit, ein Objekt zu erstellen, ohne dass man die Klasse kennt?
Um es etwas zu verdeutlichen:
Klasse1 ist abgeleitet von Klasse0. new Klasse1() würde mir eine Instanz liefern, aber ich kann/will diesen Aufruf nicht explizit ausführen. Ich weiss nur, dass die Klasse von Klasse0 abgeleitet ist, brauche aber eine Klasse1 Instanz.
Ich suche also eine Möglichkeit, Instanzen von Klasse1 zu erzeugen, ohne diese explizit zu kennen (im Gegensatz zu Klasse0, falls das was bringt).
Ist das technologisch überhaupt möglich? Geschwindigkeit spielt an diese Stelle keine Rolle.
VG
-
naja ist nicht wirklich möglich ... soll der PC rätselraten was du da haben willst?

-
Beschreib doch mal, warum du glaubst, so etwas zu brauchen.
-
Ich würde gerne eine Factory erstellen, ohne diese für jedes Projekt anpassen zu müssen. Die Unterscheidung der konkreten Klassen ist nur über eine Typ-ID möglich, die in XML spezifiziert wurde.
Um solche Sachen wie
if (type == "Typ1")
pTyp=new Typ1()zu vermeiden, wozu ich ja für jede neu Klasse Anpassungen vornehmen müsste, hatte ich mit dem Gedanken gespielt, in einem Objektpool alle möglichen Typen zu initialisieren. Die Typ-ID kennen die Typ-Klassen selbst.
Nachdem ich weiss, welche Typen ich benötige, werden die Typen ohne konkrete Referenzen wieder gelöscht, so dass nur noch Prototyp-Instanzen im Speicher liegen, von denen mittels Copy-ctor die benötigten Instanzen erzeugt werden.
-
Suchst du das abstract factory pattern?
In der Loki-Bibliothek gibts ne fertige Implementierung dazu.
-
Ich schaue mir das A.F.P. mal an. Bin mir aber nicht sicher ob es das ist.
Generell interessiert es mich trotzdem, ob der Sachverhalt aus meinem Eingangspost irgendwie doch funktionieren könnte.
-
nein, das is imho nicht möglich.
Stell dir ma vor:
Da kommt einer: "Ich will eine Boeing 737 jetzt von dir haben, hier siehst du wie ein Flugzeug aufgebaut ist, den rest musst du die selber denken!"Also, ne das geht nicht. Der Compiler muss zum Zeitpunkt wissen, wie die Klasse aufgebaut ist, schon um genug Speicher für das Objekt zu allokieren.
Was evt. möglich ist, ist dass du einfach einen Speicherbereich der passenden Größe allokierst und das dann als dein Objekt interpretierst. Aber schlag dir das ausm Kopf, das geht nicht mit polymorphie und virtuellen funktionen wegen der vtable.
Also kurzum: Es geht nicht.
Für deine Factory kannst ja Templates benutzen vielleicht.
-
kann mich den vorrednern nur anschließen.
aber das factory pattern koentne da tatsächlich weiterhelfen.wir haben mal zum spaß ein kleines CAD system geschrieben. in der ersten version war jeder objekttyp explizit angegeben:
create(Geo* geo):
if("kreis") geo = new Kreis;
else if("rect") geo = new Rect;aenderewas(Geo* geo)
if(dynamic_cast<Kreis*>(geo)) {...}
else if(dynamic_cast<Rect*>(geo)) {...}
...sobald man neue typen hinzufügt und das programm extwas komplexer ist, dann sieht man da nicht mehr druch, wo man was änderen muss.
jetzt hat jedes geoobject einen "erzeuger" und es gibt eine "factory". zudem hat jeder Type eine "typeID" und eben eine menge allgemeiner methoden, so dass man im GUI teil ausschließlich mit der abstracten basisklasse arbeiten kann (selbst die icons im menü sind dadurch dynamisch, dialoge, etc. pp.)nur falls du irgendwas ähnliches machen wolltest mit dem erzeugen unbekannter klassen

-
Ja, es geht natürlich auch anders. Ich hätte den ganzen Kram nur gerne komplett aud die konkreten Klasen abgewälzt.
Was ist mit RTTI? Gibt es da etwas?
Kann gerade schlecht surfen, aber da haben Leute wohl etwas gebastelt.
-