Definir método estático en el archivo fuente con declaración en el archivo de encabezado en C ++


142

Tengo algunos problemas para trabajar con 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;
    }
}

Quería hacer una llamada como:

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 staticpalabra clave en el archivo .cpp. C ++ no lo permite.
Fezvez

10
@Fezvez: Alternativamente, reemplácelo con /* static */. Me gusta tener los mismos modificadores y argumentos predeterminados en los archivos .h y .cpp.
David Thornley

2
TL; DR: Mantener staticen el archivo de encabezado .h, significa "adjunto a la clase, no a ningún objeto", eliminar staticen el .cpparchivo, tiene un significado diferente que no desea aquí.
Stéphane Gourichon

Respuestas:


228

Eliminar la staticpalabra clave en la definición del método. Manténgalo solo en la definición de su clase.

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


1
Ah, entiendo que staticen la definición del método significaría que solo otros métodos en esa clase pueden acceder a ese método estático, no hay otros métodos fuera de esa clase.
ABV

14
No otros métodos de clase, sino otras funciones en el archivo .cpp. No debes hacer esto en C ++ de todos modos. Si desea que una función C ++ tenga un enlace interno, debería considerar colocarla en algún espacio de nombres anónimo. El uso de staticarchivos .cpp es solo para compatibilidad con versiones anteriores de 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 el enlace estático?
lumbric

No puedes Y no tiene sentido hacerlo, ya que vincular el programa podría causar que aparezcan elementos externos no resueltos.
x13n

41

Palabras clave staticy virtualno deben repetirse en la definición. Solo deben usarse en la declaración de clase.


11

No necesita tener staticuna definición de función


-3

Las funciones miembro estáticas deben referirse a variables estáticas de esa clase. Entonces en tu caso,

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

Como su función miembro CP_StringToPstringes estática, los parámetros en esa función, inStringy también outStringdeben declararse como estáticos.

Las funciones miembro estáticas no se refieren al objeto en el que está trabajando, pero las variables que declaró se refieren a su objeto actual, por lo que devuelve un error.

Puede eliminar la estática de la función miembro o agregar estática mientras declara los parámetros que usó para la función miembro como estáticos también.


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

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.
Zachary Kraus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.