Question

J'ai plusieurs classes qui dérivent toutes d'une classe de base. Désormais, certaines classes dérivées ne seront pas compilées en fonction de la plate-forme. J'ai une classe qui me permet de retourner un objet de la classe de base, mais maintenant tous les noms des classes dérivées ont été codés en dur.

Existe-t-il un moyen de déterminer quelles classes ont été compilées, de préférence au moment de l'exécution, afin que je puisse supprimer la liaison et fournir à la place des bibliothèques chargeables dynamiquement.

Était-ce utile?

La solution

Recherchez-vous un enregistrement de classe d'exécution C ++? J'ai trouvé ce lien ( sauvegarde ).

Cela donnerait probablement ce que vous voulez, je ne suis pas sûr des modules chargés dynamiquement et de la possibilité de les enregistrer de la même manière.

Autres conseils

Je ne sais pas ce que vous essayez vraiment d'accomplir, mais vous pouvez insérer un constructeur singleton dans le fichier d'implémentation de chaque classe dérivée, qui ajoute le nom à une liste, ainsi qu'un pointeur sur une fabrique. Ensuite, la liste est toujours à jour et peut créer toutes les classes compilées.

En règle générale, l'utilisation des informations de type à l'exécution est une mauvaise idée en C ++. Ce que vous avez décrit semble être le modèle d'usine. Vous pouvez envisager de créer une sous-classe fabrique spéciale pour chaque plate-forme, qui ne connaît que les classes existantes sur cette plate-forme.

Cela ressemble à un endroit où utiliser "le polymorphisme du temps de compilation" " ou les paramètres de politique de modèle.

Voir Modern C ++ Design par Andrei Alexandrescu et son implémentation Loki basée sur le livre. Voir également la page Loki sur wikipedia.

Il existe de nombreuses astuces spécifiques au compilateur pour obtenir des informations sur les classes au moment de l'exécution. Croyez-moi, vous ne voulez pas ouvrir cette boîte de Pandore.

Il me semble que le seul moyen sérieux de le faire serait d’utiliser la compilation conditionnelle sur chacune des classes dérivées. Dans le bloc #ifdef, définissez une constante nouvelle contenant le nom de la classe en cours de compilation. Ensuite, les noms sont toujours codés en dur, mais tous dans un emplacement central.

Les noms des classes dérivées doivent être codés en dur en C ++. Il n'y a pas d'autre moyen de les utiliser. Par conséquent, non seulement il n’existe aucun moyen de détecter automatiquement les classes compilées, mais il n’y aurait aucun moyen d’utiliser ces informations si elles existaient.

Si vous pouviez spécifier des classes au moment de l'exécution en fonction de leur nom, quelque chose comme:

std :: string foo = " Derived1 " ;; Base * object = new " foo " ;; // ou la notation que vous préférez - ne fonctionne pas en C ++

puis la possibilité de dire si " Derived1 " a été compilé ou non serait utile. Puisque vous devez spécifier directement la classe, par exemple:

Base * object = new Derived1; // fonctionne en C ++

toutes les vérifications sont effectuées au moment de la compilation.

Si chaque classe a sa propre bibliothèque dynamique, vérifiez si la bibliothèque existe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top