2010-02-08 7 views
10

Généralement, les membres/objets statiques d'une classe sont les mêmes pour chaque instance de la classe ayant le membre/objet statique. Quoi qu'il en soit, que se passe-t-il si l'objet statique fait partie d'une classe modèle et dépend également de l'argument modèle? Par exemple, comme ceci:Membre du modèle statique C++, une instance pour chaque type de modèle?

template<class T> 
class A{ 
public: 
    static myObject<T> obj; 
} 

Si je jetais un objet de A comme int et l'autre comme float, je suppose qu'il y aurait deux obj, un pour chaque type?

Si je créer plusieurs objets de A comme le type int et plusieurs float s, serait-il encore deux cas obj, puisque je n'utilise deux types différents?

Répondre

18

Les membres statiques sont différents pour chaque initialisation de modèle différent. Cela est dû au fait que chaque initialisation de modèle est une classe différente qui est générée par le compilateur la première fois qu'il rencontre cette initialisation spécifique du modèle.

Le fait que les variables membres statiques sont différentes est montré par ce code:

#include <iostream> 

template <class T> class Foo { 
    public: 
    static int bar; 
}; 

template <class T> 
int Foo<T>::bar; 

int main(int argc, char* argv[]) { 
    Foo<int>::bar = 1; 
    Foo<char>::bar = 2; 

    std::cout << Foo<int>::bar << "," << Foo<char>::bar; 
} 

qui se traduit par

1,2 
+0

"différent pareil"? ;) – jamesdlin

+0

Puisque la question concerne les membres statiques, l'exemple de programme serait plus clair s'il ne créait pas d'instances Foo . Plutôt que d'assigner et d'imprimer bar1.s, vous pouvez utiliser Foo :: s à la place. –

+0

@jamesdlin Ug. Fixé. Je ne devrais pas essayer d'inverser la logique dans une phrase et ensuite pas correctement lu. – Yacoby

3

Il y a autant de variables membres statiques comme il y a des classes et cela vaut également aux modèles. Chaque instanciation séparée d'une classe de modèle crée une seule variable de membre statique. Le nombre d'objets de ces classes modélisées est sans importance.

4

A<int> et A<float> sont deux types tout à fait différents, vous ne pouvez pas couler entre eux en toute sécurité. Deux instances de A<int> partageront cependant le même objet statique myObject.

+0

merci, c'était bref mais éclairci tout ce que j'avais besoin de savoir :) – user240137

1

Les modèles C++ sont en réalité des copies de classes. Je pense que dans votre exemple, il y aurait une instance statique par instance de modèle.

+1

"Les modèles C++ sont en fait des copies de classes": cela n'a pas de sens. 0) il y a aussi des fonctions de gabarit et des fonctions de membre de gabarit, 1) définir "copie". Je suppose que vous voulez dire que chaque instanciation de modèle de classe représente un nouveau type de classe. –

+0

Oui contrairement à Java, C++ effectue en interne une copie de la classe avec la partie du modèle remplie. – Thirler

Questions connexes