¿Podría explicar por qué "NO PUEDE" implementar la función miembro de clase estática en su archivo cpp? algun error? Por lo general, no hay limitación sobre dónde implementa dicha función.
winterTTr
77
@winterTTr, la pregunta probablemente surgió porque la mayoría de los ejemplos / tutoriales en la web no presentan un ejemplo de implementación por separado, sino que lo declaran y definen en el encabezado. Al menos los primeros seis resultados en mi motor de búsqueda favorito para la "función miembro estática C ++" lo hacen de esta manera y no explican cómo implementarlo en archivos separados para un novato.
crobar
77
Cuando implemente, no repita la staticpalabra clave. Escriba la staticpalabra clave solo en la definición de clase en el archivo de encabezado
SomethingSomething
@crobar, tiene razón en que hay una escasez de ejemplos de varios archivos. Luché por resolver esto, así que decidí compartir lo siguiente:
Sí, puede definir funciones miembro estáticas en el archivo * .cpp. Si lo define en el encabezado, el compilador lo tratará por defecto como en línea. Sin embargo, no significa que existan copias separadas de la función miembro estática en el ejecutable. Siga esta publicación para obtener más información al respecto:
¿Las funciones miembro estáticas en c ++ se copian en varias unidades de traducción?
Si lo define en el cuerpo de la clase, será automáticamente predeterminado. Si está en el encabezado fuera del cuerpo de la clase, será mejor que se marque, inlineo templateobtendrá múltiples errores de definición del enlazador.
Ben Voigt
2
En tu archivo de encabezado di foo.h
classFoo{public:staticvoid someFunction(params..);// other stuff}
En su archivo de implementación, diga foo.cpp
#include"foo.h"voidFoo::someFunction(params..){// Implementation of someFunction}
Muy importante
Solo asegúrese de no usar la palabra clave estática en la firma de su método cuando implemente la función estática en su archivo de implementación.
@crobar, tiene razón en que hay una escasez de ejemplos de varios archivos, así que decidí compartir lo siguiente con la esperanza de que ayude a otros:
La #includedirectiva literalmente significa "copiar todos los datos en ese archivo a este lugar". Entonces, cuando incluye el archivo de encabezado, está textualmente dentro del archivo de código, y todo lo que contenga estará allí, más o menos el efecto de otras directivas o reemplazos de macro, cuando el archivo de código (ahora llamado unidad de compilación o unidad de traducción ) está entregado desde el módulo preprocesador al módulo compilador.
Lo que significa que la declaración y la definición de su función miembro estática estuvieron realmente en el mismo archivo todo el tiempo ...
static
palabra clave. Escriba lastatic
palabra clave solo en la definición de clase en el archivo de encabezadoRespuestas:
Es.
test.hpp:
test.cpp:
No siempre están en línea, no, pero el compilador puede hacerlos.
fuente
Prueba esto:
header.hxx:
class.cxx:
fuente
helper.hxx
helper.cxx
A.cxx
Para saber más sobre cómo c ++ maneja las funciones estáticas, visite: ¿Las funciones miembro estáticas en c ++ se copian en múltiples unidades de traducción?
fuente
Sí, puede definir funciones miembro estáticas en el archivo * .cpp. Si lo define en el encabezado, el compilador lo tratará por defecto como en línea. Sin embargo, no significa que existan copias separadas de la función miembro estática en el ejecutable. Siga esta publicación para obtener más información al respecto: ¿Las funciones miembro estáticas en c ++ se copian en varias unidades de traducción?
fuente
inline
otemplate
obtendrá múltiples errores de definición del enlazador.En tu archivo de encabezado di foo.h
En su archivo de implementación, diga foo.cpp
Muy importante
Solo asegúrese de no usar la palabra clave estática en la firma de su método cuando implemente la función estática en su archivo de implementación.
Buena suerte
fuente
@crobar, tiene razón en que hay una escasez de ejemplos de varios archivos, así que decidí compartir lo siguiente con la esperanza de que ayude a otros:
fuente
Seguro que puede. Yo diría que deberías.
Este artículo puede ser útil:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
fuente
La
#include
directiva literalmente significa "copiar todos los datos en ese archivo a este lugar". Entonces, cuando incluye el archivo de encabezado, está textualmente dentro del archivo de código, y todo lo que contenga estará allí, más o menos el efecto de otras directivas o reemplazos de macro, cuando el archivo de código (ahora llamado unidad de compilación o unidad de traducción ) está entregado desde el módulo preprocesador al módulo compilador.Lo que significa que la declaración y la definición de su función miembro estática estuvieron realmente en el mismo archivo todo el tiempo ...
fuente