2010-02-08 21 views
10

Normalmente los miembros/objetos estáticos de una clase son los mismos para cada instancia de la clase que tiene el miembro/objeto estático. De todos modos, ¿qué pasa si el objeto estático es parte de una clase de plantilla y también depende del argumento de la plantilla? Por ejemplo, así:miembro de plantilla estática de C++, una instancia para cada tipo de plantilla?

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

Si hubiera arrojado un objeto de A como int y otro como float, supongo que habría dos obj, uno para cada tipo?

Si me gustaría crear varios objetos de un tipo como int y múltiples float s, ¿seguiría siendo dos obj casos, ya que sólo estoy usando dos tipos diferentes?

Respuesta

18

Los miembros estáticos son diferentes para cada inicialización de plantilla diferente. Esto se debe a que cada inicialización de plantilla es una clase diferente que genera el compilador la primera vez que encuentra esa inicialización específica de la plantilla.

El hecho de que las variables miembro estáticas son diferentes se muestra por este código:

#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; 
} 

que se traduce en

1,2 
+0

"different same"? ;) – jamesdlin

+0

Como la pregunta es sobre miembros estáticos, el programa de ejemplo sería más claro si no creara ninguna instancia de Foo . En lugar de asignar e imprimir barras1.s, puede usar Foo :: s en su lugar. –

+0

@jamesdlin Ug. Fijo. No debería intentar dar vuelta la lógica en una oración y luego no leer correctamente. – Yacoby

3

Hay tantas variables miembro estáticas, ya que hay clases y esto se aplica por igual a las plantillas. Cada instanciación separada de una clase de plantilla crea solo una variable de miembro estática. La cantidad de objetos de esas clases con plantillas es irrelevante.

4

A<int> y A<float> son dos tipos completamente diferentes, no se puede transmitir entre ellos de forma segura. Sin embargo, dos instancias de A<int> compartirán el mismo myObject estático.

+0

gracias, eso fue breve pero aclaró todo lo que necesitaba saber :) – user240137

1

En C++, las plantillas son en realidad copias de las clases. Creo que en su ejemplo habría una instancia estática por instancia de plantilla.

+1

"Las plantillas C++ son en realidad copias de las clases": eso no tiene sentido. 0) también hay funciones de plantilla y funciones de miembro de plantilla, 1) definir "copia". Supongo que lo que quieres decir es que cada instanciación de plantilla de clase representa un nuevo tipo de clase. –

+0

Sí, a diferencia de Java, C++ internamente hace una copia de la clase con la parte de plantilla completa. – Thirler

Cuestiones relacionadas