Erstellen eines neuen Objekts aus den Informationen des dynamischen Typs
In C++, gibt es eine Möglichkeit, eine Abfrage der Art des Objekts und dann diese Informationen verwenden, um dynamisch erstellen Sie ein neues Objekt vom gleichen Typ?
Sagen wir zum Beispiel, ich habe ein einfaches 3-Klassen-Hierarchie:
class Base
class Foo : public Base
class Bar : public Base
Nun mal angenommen, ich gebe Ihnen ein Objekt gewirkt, Typ Basis-das ist in Wirklichkeit vom Typ Foo.
Gibt es eine Möglichkeit eine Abfrage des Typs und verwenden diese Informationen, um später das erstellen neuer Objekte vom Typ Foo?
InformationsquelleAutor der Frage Daniel | 2010-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Clone-Methode
Es ist nichts vorgesehen, durch die Sprache, die Abfragen geben und können Sie konstruieren, dass die Informationen, aber Sie können die Möglichkeit bieten, für Ihre Klasse bietet verschiedene Möglichkeiten, die einfachste davon ist die Verwendung einer virtuellen Methode:
Dieser etwas tut, etwas anders: clone das aktuelle Objekt. Dies ist oft, was Sie wollen, und ermöglicht es Ihnen, um die Objekte herum, als Vorlagen, die Sie dann Klonen und ändern Sie wie gewünscht.
Erweiterung auf Tronic, können Sie auch generieren die Klon-Funktion.
Warum auto_ptr? So können Sie neue zu reservieren das Objekt der übertragung des Eigentums ausdrücklich ist, und der Anrufer hat keine Zweifel, dass löschen müssen ausplanen. Zum Beispiel:
Objekt Fabrik
Wenn Sie es vorziehen, zu tun, was Sie fragte und bekommen eine Fabrik, die verwendet werden können, die unabhängig von Instanzen:
Viel von der gleichen Logik und Funktionalität kann verwendet werden, als für eine clone-Methode, wie get_factory erfüllt, die Hälfte der gleichen Rolle, und der return-Typ (und seine Bedeutung) ist der einzige Unterschied.
Habe ich auch abgedeckt Fabriken ein paar mal schon. Sie konnte sich mein SimpleFactory Klasse, so dass Sie Ihren factory-Objekt (zurückgegeben von get_factory) ein Verweis auf eine Globale Fabrik und die Parameter übergeben zu erstellen (z.B. die Klasse der registrierten Namen—überlegen, wie sich zu bewerben boost::function und boost::bind, um diese einfach zu bedienen).
InformationsquelleAutor der Antwort
Die Häufig verwendete Methode zum erstellen von Kopien von Objekten von Basis-Klasse ist das hinzufügen einer clone-Methode, die im wesentlichen eine polymorphe copy-Konstruktor. Diese virtuelle Funktion in der Regel muss definiert werden, in jeder abgeleiteten Klasse, aber können Sie vermeiden, einige copy&paste mithilfe der Neugierig Recurring Template Pattern:
Beachten Sie, dass Sie können verwenden die gleichen CRTP-Klasse für jede Funktionalität das wäre das gleiche in jeder abgeleiteten Klasse, aber das erfordert Kenntnisse des abgeleiteten Typs. Es gibt viele andere Verwendungen für diese, neben clone(), z.B. double dispatch.
InformationsquelleAutor der Antwort Tronic
Gibt es nur einige hacky Möglichkeiten, dies zu tun.
Die erste und IMHO das hässlichste ist:
Beachten Sie, dass dies nur funktioniert, wenn Sie haben RTTI aktiviert und die Basis enthält einige virtuelle Funktion.
Zweiten ein ordentlicher version ist eine Reine virtuelle Klon-Funktion der Basisklasse
Dies ist viel ordentlicher.
Eine Coole/interessante Sache über dieses ist, dass
Foo::clone
gibt eineFoo*
, währendBar::clone
gibt eineBar*
. Man könnte erwarten, dass diese Dinge brechen, aber alles funktioniert durch ein feature von C++ aufgerufen kovariante Rückgabetypen.Leider kovariante Rückgabetypen arbeiten nicht für smart-Pointer, also mit
sharted_ptrs
würde der code wie folgt Aussehen.InformationsquelleAutor der Antwort Michael Anderson
Ja, verwenden Sie
typeid()
BetreiberBeispiel:
Ausgabe:
Wenn der Typ typeid wertet ist ein Zeiger vorangestellt der dereference-operator (*), und dieser Zeiger hat den Wert null, typeid wirft einen bad_typeid exception
Lesen mehr.....
InformationsquelleAutor der Antwort Prasoon Saurav
Können Sie z.B.
typeid
Abfrage ein Objekt den dynamischen Typ, aber ich kenne keine Möglichkeit, direkt zu instanziieren ein neues Objekt vom Typ Informationen.Jedoch, abgesehen von der
clone
Ansatz oben erwähnt, könnte man eine Fabrik:P. S.: Der wesentliche Teil dieses code-Beispiel ist natürlich die
Factory::createFrom
Methode. (Es ist wohl nicht die schönen C++ - code, da meine C++ hat da ein wenig rostig. Die factory-Methode wahrscheinlich sollte nicht statisch sein, auf den zweiten Gedanken.)InformationsquelleAutor der Antwort stakx
Ich Makros verwendet in meinem Projekt zu synthetisieren solcher Methoden.
Ich bin nur der Erforschung dieser Ansatz nun, also ich kann mich irren, aber hier eine Antwort auf deine Frage in meinem code von IAllocable.hh. Beachten Sie, dass ich mit GCC 4.8, aber ich hoffe, 4.7 passt.
Verwendung:
Hoffe, es hilft.
InformationsquelleAutor der Antwort cppist
InformationsquelleAutor der Antwort Jagannath
Wenn es gibt sehr viele Klassen, die sich aus der gleichen Basis-Klasse dann mit diesem code sparen Sie umfassen Klon Methoden jeder Klasse. Es ist ein bequemer Weg, Klonen, beinhaltet Vorlagen und eine intermediate-Unterklasse. Es ist machbar, wenn die Hierarchie ist flach genug.
InformationsquelleAutor der Antwort LinguistTroubadour