2011-05-12 30 views
106

estoy teniendo un poco de problemas para trabajar con los métodos estáticos en C++Los métodos estáticos en C++

Ejemplo .h:

class IC_Utility { 
public: 
    IC_Utility(); 
    ~IC_Utility(); 

    std::string CP_PStringToString(const unsigned char *outString); 
    void CP_StringToPString(std::string& inString, unsigned char *outString, short inMaxLength); 
    static void CP_StringToPString(std::string& inString, unsigned char *outString); 
    void CP_StringToPString(FxString& inString, FxUChar *outString); 

}; 

Ejemplo .cpp:

static void IC_Utility::CP_StringToPString(std::string& inString, unsigned char *outString) 
{ 
    short  length = inString.length(); 

    if(outString != NULL) 
    { 
     if(length >= 1) 
      CPLAT::CP_Utility::CP_CopyMemory(inString.c_str(), &outString[ 1 ], length); 

      outString[ 0 ] = length; 
    } 
} 

que querían hacer una llamar al:

IC_Utility::CP_StringToPString(directoryNameString, directoryName); 

Pero Me sale un error:

error: cannot declare member function 'static void IC_Utility::CP_StringToPString(std::string&, unsigned char*)' to have static linkage 

No entiendo por qué no puedo hacer esto. ¿Alguien puede ayudarme a entender por qué y cómo lograr lo que quiero?

+2

En primer lugar, debe eliminar la palabra clave 'static' en el archivo .cpp. C++ no lo permite. – Fezvez

+0

¿Para qué es el error? –

+9

@Fezvez: Alternativamente, reemplázalo con '/ * static * /'. Me gusta tener los mismos modificadores y argumentos predeterminados en los archivos .h y .cpp. –

Respuesta

179

Eliminar static palabra clave en la definición de método. Mantenlo solo en tu definición de clase.

static palabra clave colocada en el archivo .cpp significa que una determinada función tiene un enlace estático, es decir. solo es accesible desde otras funciones en el mismo archivo.

+1

Ah, entendí que 'static' en la definición del método significaría que solo otros métodos de esa clase pueden acceder a ese método estático, no a otros métodos fuera de esa clase. – ABV

+12

No hay otros métodos de clase, sino otras funciones en el archivo .cpp. No deberías hacer esto en C++ de todos modos. Si desea que una función de C++ tenga un enlace interno, debería considerar colocarla en algún espacio de nombre anónimo. El uso de 'static' en archivos .cpp es solo por compatibilidad con versiones anteriores con C. – x13n

+1

Solo por curiosidad ... Si defino un miembro de clase estático directamente en la clase (en el archivo .h), ¿cómo podría usar enlaces estáticos? – lumbric

9

Usted no necesita tener static de definición de la función

32

Palabras clave static y virtual no debe repetirse en la definición. Solo deben usarse en la declaración de clase.

-3

Las funciones de miembro estático deben hacer referencia a variables estáticas de esa clase. Así, en su caso,

static void CP_StringToPString(std::string& inString, unsigned char *outString); 

Debido a que su función miembro CP_StringToPstring es estático, los parámetros de esa función, inString y outString deben ser declarados como estática también.

Las funciones miembro estáticas no hacen referencia al objeto en el que está trabajando, pero las variables declaradas hacen referencia a su objeto actual por lo que devuelve un error.

Puede eliminar la función estática de la función miembro o agregar estática al tiempo que declara que los parámetros que utilizó para la función miembro también son estáticos.

+1

inString y outString son argumentos de la función estática. Ellos no son miembros de la clase. No hay necesidad de convertirlos a estáticos. – 999k

+0

Eso no es correcto en absoluto. Puede colocar argumentos no estáticos en una función miembro estática.Pero de los miembros de la clase, solo puede acceder/modificar los estáticos en la función. –

Cuestiones relacionadas