2009-11-23 4 views
2

En C++, que j'ai une chose de classe, je voudrais pour inclure un membre const de ce type, quelque chose comme:Puis-je avoir une instance de constante de temps de compilation d'une classe (en tant que membre) en C++?

class Thing 
{ 
    public: 
     Thing(); 
    private: 
     static const Thing THING; 
}; 

Mais je ne pense pas que cela fonctionne comme ci-dessus. Comment puis-je faire ceci?

+1

Avez-vous essayé? Je ne vois pas pourquoi cela ne devrait pas fonctionner. Si vous essayez d'implémenter un singleton, il existe de meilleurs moyens. – Sebastian

+0

Je n'ai pas compris que je devais instancier l'instance ailleurs. Je pensais que ma déclaration comme ci-dessus serait suffisante (et qu'elle utiliserait le constructeur par défaut) – Tarquila

Répondre

3

Le petit programme suivant compile et des liens en utilisant GCC 3.4.5 (MinGW):

class Thing 
{ 
public: 
    Thing(); 
private: 
    static const Thing THING; 
}; 

Thing::Thing() 
{} 

// We must instantiate the static variable somewhere, like inside 'Thing.cpp' 
const Thing Thing::THING = Thing(); 

int main(int argc, char* argv[]) 
{ 
    return 0; 
} 
0

Je ne suis pas sûr de ce que la norme dit à ce sujet, mais je ne vois pas pourquoi cela ne devrait pas fonctionner. Il compile bien sur mon gcc. Avez-vous pensé à instancier l'objet statique en dehors de la déclaration de classe?

+0

Non, je ne l'ai pas fait. Je suppose que je pensais que la déclaration signifierait qu'elle s'instancie avec le constructeur par défaut. Merci. – Tarquila

0

Non, vous ne pouvez. En tant que S.C.Madsen et int3 déjà publié, vous pouvez déclarer const const statique dans la portée de classe pour tout type, tant qu'il est correctement défini (dans le fichier cpp) et initialisé, Mais il ne peut pas être une constante de temps de compilation.
La constante de temps de compilation est une constante que vous pouvez utiliser comme argument de modèle et comme taille de tableau intégrée. Ces constantes peuvent également être optimisées mieux que les constantes d'exécution. Actuellement, AFAIK, seuls les types numériques intégrés peuvent servir de constantes de temps de compilation.
La raison, BTW, est que cette constante devrait être évaluée au moment de la compilation (de la même manière que les littéraux).

Questions connexes