C++ - Laufzeit-Kenntnisse der Klassen
Ich habe mehrere Klassen, die alle abgeleitet von einer Basisklasse, nun einige von den abgeleiteten Klassen nicht kompiliert werden, je nach Plattform. Ich habe eine Klasse, die mir die Rückkehr, die ein Objekt der Basisklasse, aber jetzt all die Namen der abgeleiteten Klassen wurden hart codiert.
Gibt es eine Möglichkeit zu bestimmen, welche Klassen kompiliert wurden, zur Laufzeit am besten so, dass ich entfernen Sie die Verknüpfung und statt dessen dynamisch ladbare Bibliotheken statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie auf der Suche nach C++ - runtime-Klasse-Registrierung? Ich fand diese link (backup).
Dass würde wahrscheinlich erreichen, was Sie wollen, ich bin mir nicht sicher über die dynamisch geladenen Module und ob oder nicht, können Sie Sie registrieren mit der gleichen Methode.
Ich weiß nicht, was Sie wirklich versuchen zu erreichen, aber Sie könnten ein singleton-Konstruktor in jeder abgeleiteten Klasse die Implementierung Datei fügt hinzu, dass die Namen auf einer Liste, zusammen mit einem Zeiger auf eine Fabrik. Anschließend wird die Liste immer up to date und können alle kompilierten Klassen.
In der Regel, die sich auf den run-time-type-information ist eine schlechte Idee in C++. Was Sie beschrieben haben scheint, wie das factory-pattern. Möchten Sie vielleicht erwägen, eine spezielle factory-Unterklasse für jede Plattform, die müsste nur wissen über die Klassen, die es gibt auf dieser Plattform.
Das klingt wie ein Ort, um zu verwenden "compile time polymorphism" bzw. die Vorlage für Parameter.
Siehe Modern C++ Design von Andrei Alexandrescu und seine Loki Implementierung basiert auf dem Buch. Siehe auch die Loki Seite bei wikipedia.
Gibt es böse, compiler-spezifische tricks für den Zugriff auf Klasseninformationen zur Laufzeit. Vertrauen Sie mir, Sie wollen nicht zu öffnen, das kann von Würmern.
Scheint es mir, dass die einzige ernsthafte Möglichkeit dies zu tun, wäre die Verwendung der bedingten Kompilierung auf jeder der abgeleiteten Klassen. Innerhalb des Blockes #ifdef, definieren Sie eine neue Konstante enthält den Namen der Klasse, die kompiliert wird. Dann, die Namen sind noch hard codiert, aber alle in einer zentralen Lage.
Den Namen der abgeleiteten Klassen werden hart-codiert in C++. Es gibt keinen anderen Weg, Sie zu verwenden. Daher gibt es nicht nur keine Möglichkeit, automatisch festzustellen, welche Klassen kompiliert wurden, gäbe es keine Möglichkeit, diese Informationen zu nutzen, wenn es existierte.
Wenn Sie könnte angeben, Klassen zur Laufzeit, basierend auf Ihren Namen, so etwas wie:
std::string foo = "Derived1";
Basis * object = new "foo"; //oder was auch immer-notation, die Sie wie - funktioniert nicht in C++
dann die Möglichkeit zu sagen, wenn "Derived1" kompiliert wurde oder nicht nützlich wäre. Da müssen Sie die Klasse direkt, wie:
Base * Objekt = new Derived1; //funktioniert in C++
alle die Prüfung erfolgt zur compile-Zeit.
Wenn jede Klasse hat Ihren eigenen dynamischen Bibliothek, nur prüfen, ob die Bibliothek vorhanden ist.