2009-11-07 3 views
6

Je voudrais être en mesure d'enregistrer mes classes dans un std::map ou un vecteur, ne pensez pas à des doublons et autres pour l'instant, mais je ne veux pas l'enregistrer dans le appel de constructeur de classe ou tout dans la fonction de la classe, en quelque sorte le faire en dehors de la classe si même si je ne l'instancie jamais, je serais capable de savoir qu'il existe.En quelque sorte enregistrer mes classes dans une liste

Exemple:

// Somehow, from outside the myclass, in a scope that will be called 
//in the begining of the proccess, add "MyClass1" to a 
//list so it can be instanciated later 
class MyClass1{ 

} 

Ensuite, je ferais un #define de celui-ci ou si possible, un modèle.
Je ne sais pas si je me suis fait clairement (encore une fois) ... Mon point est que j'ai besoin de connaître chaque classe que j'ai sans avoir à appeler chacun d'entre eux.
Mon idée était de créer un #define pour le rendre plus facile de déclarer l'en-tête de la classe et appeler quelque chose qui enregistrerait cette classe spécifique à une liste

Cela peut-il être fait ou devrai-je la carte manuellement?

// desirable: 
#define CLASSREGISTER(myclass) makethemagic(##myclass); class myclass { 
}; 

Je sais, avec qui définissent je ne pouvais pas utiliser l'héritage etc ... Ce que je voulais essayer de donner un exemple de ce que je pensais de créer en quelque sorte ...

+0

Je pense que vous devriez ajouter la balise 'design-pattern'. – Alexandru

Répondre

9

Voici la méthode mettre des noms de classes dans un vecteur. Laissez un commentaire si j'ai manqué des détails importants. Je ne pense pas que cela fonctionnera pour les gabarits, cependant. L'astuce ici est de faire un peu de calcul avant d'appeler main() et vous pouvez y parvenir via l'initialisation globale. REGISTER_CLASS (cls) génère réellement du code pour appeler le constructeur de MyClasses au démarrage du programme.

MISE À JOUR: Après suggestion gf vous pouvez écrire ceci:

#define REGISTER_CLASS(cls) temp_##cls; static MyClasses myclass_##cls(#cls); class cls 
class REGISTER_CLASS(XYZ) { int x, y, z; } 
+0

Désolé, mais je ne l'ai pas compris ... comment ferais-je pour déclarer la classe avec votre code? – Jonathan

+0

à l'exception de std :: string/string – ScottJ

+0

@Jonathan: posté l'exemple à propos de XYZ. C'est ce que tu voulais? – Alexandru

-2

Utiliser boost :: mpl, vecteur ou carte.

Questions connexes