2011-03-21 18 views
88

¿Es posible implementar static funciones de miembro de clase en el archivo * .cpp en lugar de hacerlo en el archivo de encabezado?¿Cómo implementar las funciones miembro de clase estática en el archivo * .cpp?

¿Son todas las funciones static siempre inline?

+4

Podría explicar por qué "no se puede" implementar la función de memeber de clase estática en su archivo cpp? cualquier error? Por lo general, no hay ninguna limitación sobre dónde implementar dicha función. – winterTTr

+3

@winterTTr, La pregunta probablemente surgió porque la mayoría de los ejemplos/tutoriales en la web no presentan un ejemplo de implementación separado, en cambio lo declaran y definen en el encabezado. Al menos los primeros seis hits en mi motor de búsqueda favorito para "función de miembro estática de C++", todos lo hacen de esta manera y no explican cómo implementarlo en archivos separados para un novato. – crobar

+3

Cuando implemente, no repita la palabra clave 'static'. Escriba la palabra clave 'static' solo en la definición de clase en el archivo de encabezado – SomethingSomething

Respuesta

111

que es.

test.hpp:

class A { 
public: 
    static int a(int i); 
}; 

test.cpp:

#include <iostream> 
#include "test.hpp" 


int A::a(int i) { 
    return i + 2; 
} 

using namespace std; 
int main() { 
    cout << A::a(4) << endl; 
} 

Son no siempre en línea, no, pero el compilador pueden hacer ellos.

41

Prueba esto:

header.hxx:

class CFoo 
{ 
public: 
    static bool IsThisThingOn(); 
}; 

class.cxx:

#include "header.hxx" 
bool CFoo::IsThisThingOn() // note: no static keyword here 
{ 
    return true; 
} 
2

Sí, puede definir funciones de miembro estáticas en el archivo * .cpp. Si lo define en el encabezado, el compilador lo tratará de forma predeterminada como en línea. Sin embargo, no significa que existirán copias separadas de la función de miembro estático en el ejecutable. Siga esta publicación para obtener más información al respecto: Are static member functions in c++ copied in multiple translation units?

+0

Si lo defines en el cuerpo de la clase, automáticamente será el predeterminado. Si está en el encabezado fuera del cuerpo de la clase, será mejor marcar 'inline' o' template' o obtendrás múltiples errores de definición del enlazador. –

7

helper.hxx

class helper 
{ 
public: 
    static void fn1() 
    { /* defined in header itself */ } 

    /* fn2 defined in src file helper.cxx */ 
    static void fn2(); 
}; 

helper.cxx

#include "helper.hxx" 
void helper::fn2() 
{ 
    /* fn2 defined in helper.cxx */ 
    /* do something */ 
} 

A.cxx

#include "helper.hxx" 
A::foo() { 
    helper::fn1(); 
    helper::fn2(); 
} 

Para saber más sobre cómo maneja C++ funciones estáticas visitar: Are static member functions in c++ copied in multiple translation units?

0

La directiva #include literalmente significa "copiar todos los datos de ese archivo a este punto." Entonces, cuando incluye el archivo de encabezado, está textualmente dentro del archivo de código y todo estará allí, otorgue o tome el efecto de otras directivas o macro reemplazos, cuando el archivo de código (ahora llamado compilación unidad o traducción unidad) se transfiere desde el módulo de preprocesador al módulo de compilación.

Lo que significa que la declaración y definición de su función miembro estática estaban realmente en el mismo archivo todo el tiempo ...

1

@crobar, tienes razón en que hay una escasez de ejemplos de varios archivos, por lo que decidí compartir lo siguiente con la esperanza de que ayuda a los demás:

:::::::::::::: 
main.cpp 
:::::::::::::: 

#include <iostream> 

#include "UseSomething.h" 
#include "Something.h" 

int main() 
{ 
    UseSomething y; 
    std::cout << y.getValue() << '\n'; 
} 

:::::::::::::: 
Something.h 
:::::::::::::: 

#ifndef SOMETHING_H_ 
#define SOMETHING_H_ 

class Something 
{ 
private: 
    static int s_value; 
public: 
    static int getValue() { return s_value; } // static member function 
}; 
#endif 

:::::::::::::: 
Something.cpp 
:::::::::::::: 

#include "Something.h" 

int Something::s_value = 1; // initializer 

:::::::::::::: 
UseSomething.h 
:::::::::::::: 

#ifndef USESOMETHING_H_ 
#define USESOMETHING_H_ 

class UseSomething 
{ 
public: 
    int getValue(); 
}; 

#endif 

:::::::::::::: 
UseSomething.cpp 
:::::::::::::: 

#include "UseSomething.h" 
#include "Something.h" 

int UseSomething::getValue() 
{ 
    return(Something::getValue()); 
} 
Cuestiones relacionadas