2009-07-19 6 views
1

Lorsque j'ai besoin pour obtenir le nom de classe à l'intérieur d'une de ses méthodes que j'appelle simplement:obtenir le nom de classe variable de type int statique avec typeid (* cela) .name pour sa propre définition - C++

typeid(*this).name() 

(puis Je scinde le résultat en jetons et récupère le nom de la classe)

Maintenant, je dois définir une variable membre statique et avoir besoin du nom de la classe pour cela. Mais je ne suis pas dans une méthode! Donc, je ne peux pas utiliser (* ceci).

Au départ, je pensais que je pouvais faire quelque chose comme:

#define INIT_STAT_VAR 
    const char * cname = typeid(*this).name; 
    int cname##::var = 1; 

Toute idée comment je pourrais obtenir le nom de la classe pour la définition de la variable membre statique? (non, je ne peux pas écrire directement le nom de la classe pour la définition;])

merci!

+4

Peut-être pourriez-vous expliquer a) ce que vous faites avec le nom de la classe b) pourquoi vous ne pouvez pas le coder en dur? Aussi, savez-vous que ce que vous faites est intrinsèquement non portable? –

+0

a. Je voudrais imprimer le nom de la classe et le nom de la méthode (__FUNCTION__) à chaque fois que la méthode (qui a le #define implémenté) a été appelée b. Je veux implémenter ceci dans tout le code que je fais, et le code devrait seulement être intégré quand je le veux ainsi. Je voudrais juste mettre le symbole #define dans les méthodes pertinentes. c. mmm ... n'a pas d'importance, c'est juste pour mon travail interne, le code final n'a pas besoin d'avoir mis en œuvre. – sciloop

+0

euh, je voulais écrire la macro predefind avec les deux traits de soulignement avant et après FUNCTION dans la ligne un, mais cela a été changé en (FUNCTION) – sciloop

Répondre

1

Je ne pense pas qu'il soit directement possible de faire ce que vous voulez - comme une méthode statique n'obtient pas un pointeur d'objet, elle ne peut pas appeler typeid dessus. Vous pouvez créer un objet temporaire dans la méthode statique et l'utiliser sur typeid, mais cela va à l'encontre de l'avoir comme méthode statique.

Une autre solution (si vous pouvez garantir qu'au moins une instance de la classe est définie) serait de créer une variable membre statique que vous initialisez une fois dans le constructeur, puis d'accéder à partir d'une méthode statique. Il est un peu hacky, mais fonctionne:

#include <typeinfo> 
#include <string> 

class Foo { 
public: 
    Foo() { 
    if (name == NULL) { 
     const std::type_info& id = typeid(*this); 
     name = new std::string(id.name()); 
    } 
    // Normal object creation. 
    } 

    static std::string getName() { return *name; } 

private: 
    static std::string* name; 
}; 

std::string* Foo::name = NULL; 
+0

merci, cela semble intéressant, Dave. Mais malheureusement, si dans le dernier code de lignes, il y a encore le nom de classe (Foo), je pourrais aussi écrire directement la définition de ma variable. Ou ne comprends-je pas correctement? – sciloop

+0

@sciloop: Oui, il est nécessaire d'allouer du stockage pour le membre statique, ne pense pas qu'il existe un moyen de contourner cela. – DaveR

+0

oui, après quelques heures d'enquête, je vois que je dois taper le nom, chaque fois que j'ai une autre classe ... – sciloop

0

Vous pouvez utiliser typeid(ClassName).name() ... mais vous pouvez aussi faire simplement "ClassName".

+0

voulez-vous dire avec (ClassName) et "ClassName" le nom de classe spécifique? – sciloop

+0

oui, le nom de la classe qui a la méthode – cube

+0

euh, mais le point de ma question était comment obtenir ce nom en ne le tapant pas;] – sciloop

0

Utilisez la macro __class__ si votre compilateur le prend en charge.

+0

malheureusement, il n'y a pas une telle chose , ici (http://msdn.microsoft.com/en-us/library/b0084kay%28VS.80%29.aspx). Je ne pouvais pas non plus trouver cela pour le compilateur intel. Mais peut-être que cela fera partie de la norme C++ x0? – sciloop

+0

Je pensais que c'était à l'étude, mais il n'y a aucun signe dans la version actuelle. D'oh. – outis

Questions connexes