Frage

Ich habe mehrere Klassen, die alle von einer Basisklasse ableiten, jetzt einige der abgeleiteten Klassen nicht abhängig von der Plattform kompiliert werden. Ich habe eine Klasse, die mir ein Objekt der Basisklasse zurückkehren kann, aber jetzt alle Namen der abgeleiteten Klassen hart codiert worden sind.

Gibt es eine Möglichkeit zu bestimmen, welche Klassen kompiliert wurde, zur Laufzeit bevorzugt, so dass ich die Verknüpfung entfernen und stattdessen stattdessen dynamisch ladbare Bibliotheken bieten.

War es hilfreich?

Lösung

Suchen Sie C ++ Laufzeitklasse Registrierung? Ich fand diese Link ( Backup ).

Das würde wahrscheinlich erreichen, was Sie wollen, ich bin nicht sicher über die dynamisch geladene Module und ob Sie sie mit der gleichen Methode registrieren.

Andere Tipps

Ich weiß nicht, was Sie wirklich zu tun versuchen, aber man konnte einen Singleton-Konstruktor in jeder abgeleiteten Klasse Implementierungsdatei setzen, die den Namen auf eine Liste hinzufügt, zusammen mit einem Zeiger auf einer Fabrik. Dann wird die Liste immer auf dem Laufenden und können alle in Klassen zusammengestellt erstellen.

Im Allgemeinen auf dem Laufzeittypinformation zu verlassen ist eine schlechte Idee in C ++. Was Sie haben scheint, wie die Fabrikmuster beschrieben. Sie können zu prüfen, für jede Plattform eine spezielle Fabrik Unterklasse zu schaffen, die nur über Klassen kennen würden, die auf dieser Plattform existiert.

Das klingt wie ein Ort zu verwenden oder die Vorlage Richtlinienparameter „Polymorphismus übersetzen“.

Siehe Moderne C ++ Design by Andrei Alexandrescu und seine Loki Implementierung basiert auf dem Buch. Siehe auch die Loki Seite bei Wikipedia.

Es gibt böse, Compiler-spezifische Tricks für bei Klasseninformationen zur Laufzeit zu bekommen. Vertrauen Sie mir, Sie wollen nicht, dass die Dose Würmer öffnen.

Es scheint mir, dass die einzige ernsthafte Art und Weise, dies zu tun bedingte Kompilierung auf jedem der abgeleiteten Klassen zu verwenden wäre. Im #ifdef Block definieren Sie einen neue Konstante, die die Klassennamen enthält, die kompiliert wird. Dann werden die Namen noch hart codiert, aber alle in zentraler Lage.

Die Namen der abgeleiteten Klassen haben in C hartcodiert sein ++. Es gibt keinen anderen Weg, um sie zu benutzen. Daher ist nicht nur gibt es keine Möglichkeit automatisch zu erkennen, welche Klassen kompiliert wurde, gäbe es keine Möglichkeit, diese Informationen zu verwenden, wenn es existiert.

Wenn Sie Klassen zur Laufzeit basierend auf ihrem Namen angeben können, so etwas wie:

std :: string foo = "Derived1"; Basis * Objekt = new "foo"; // oder was auch immer Notation Sie mögen - funktioniert nicht in C ++

dann die Möglichkeit zu sagen, ob „Derived1“ kompiliert wurde oder nicht sinnvoll wäre. Da Sie die Klasse direkt angeben müssen, wie:

Basis * Objekt = new Derived1; // funktioniert in C ++

alle Prüfung bei der Kompilierung durchgeführt wird.

Wenn jede Klasse eine eigene dynamische Bibliothek, nur prüfen, ob die Bibliothek vorhanden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top