una son qué que programacion objeto métodos miembros metodos los funcion estáticos estaticos clase c++ c++-faq

c++ - son - ¿Qué significa tener una referencia indefinida a un miembro estático?



static c# (2)

Acabo de escribir una clase con algunos miembros de datos estáticos, pero ahora estoy recibiendo errores sobre "referencias indefinidas". ¿Por qué no funciona esto? ¿Qué estoy haciendo mal?

(Nota: se pretende que sea una entrada a las Preguntas frecuentes sobre C ++ de Stack Overflow . Si desea criticar la idea de proporcionar una FAQ en este formulario, la publicación en el meta que inició todo esto sería el lugar para hacerlo. esa pregunta se monitorea en la sala de chat de C ++ , donde comenzó la idea de las preguntas frecuentes en primer lugar, por lo que es muy probable que su respuesta sea leída por aquellos a quienes se les ocurrió la idea.)


Debe crear una instancia de los miembros estáticos definidos en un encabezado en un archivo .cpp. Por ejemplo:

// foo.h class foo { static int X; }; // foo.cpp #include "foo.h" int foo::X = 0;


Para comprender esto, debe tener una buena comprensión de la compilación y la vinculación , y las diferencias entre las declaraciones y las definiciones .

Considere la siguiente clase:

//In header file class Example { static bool exampleStaticMember; };

Aquí, exampleStaticMember se declara pero no se define. Esto significa que si exampleStaticMember se usa de una manera que significa que debe tener una dirección, entonces debe haber una definición separada para ello. En general, ninguna declaración de un miembro de datos estáticos en una definición de clase es una definición de ese miembro.

La declaración requerida generalmente se coloca en el archivo cpp que contiene las otras definiciones para los miembros de la clase. Debe estar en el mismo espacio de nombres que la definición de clase. La definición se ve típicamente como:

//In source file: //This may optionally have an initialiser (eg "= true") bool Example::exampleStaticMember;

La definición se puede colocar en cualquier archivo cpp, pero no se debe colocar en el encabezado con la clase, ya que es probable que se rompa la Regla de una definición .

Como un caso especial, si la variable miembro estática es una constante de const o un tipo de enumeración, entonces puede tener un inicializador en la definición de la clase:

//In header file class Example { static const int initialised = 15; };

En este caso, la definición en el archivo cpp aún es necesaria, pero no se le permite tener un inicializador:

//In source file //Note: no initialiser! const int Example::initialised;

Los miembros estáticos que se han inicializado de esta manera se pueden usar en expresiones constantes.

Plantillas

Para un miembro de datos estáticos de una plantilla, las cosas son ligeramente diferentes. El miembro estático debe definirse en el encabezado junto con el resto de la clase:

//In header file template<typename T> class Example { static int exampleInt; static T exampleT; } template<typename T> int Example<T>::exampleInt; template<typename T> T Example<T>::exampleT;

Esto funciona porque hay una excepción específica a la regla de una definición para los miembros de datos estáticos de las plantillas de clase.

Otros usos de la estática.

Cuando la palabra clave static se aplica a funciones y objetos que no están dentro del alcance de una clase, puede adquirir un significado muy diferente.

Cuando se aplica a los objetos en un ámbito de función, declara un objeto que se inicializa en la primera ejecución de la función y que posteriormente mantiene su valor entre las llamadas de función.

Cuando se aplica a objetos o funciones en el ámbito del espacio de nombres (fuera de cualquier definición de clase o función), declara objetos o funciones con enlace interno . Este uso está en desuso para los objetos, ya que el unnamed-namespace proporciona una mejor alternativa.