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?
c++
static-linking
ABV
fuente
fuente

staticpalabra clave en el archivo .cpp. C ++ no lo permite./* static */. Me gusta tener los mismos modificadores y argumentos predeterminados en los archivos .h y .cpp.staticen el archivo de encabezado.h, significa "adjunto a la clase, no a ningún objeto", eliminarstaticen el.cpparchivo, tiene un significado diferente que no desea aquí.Respuestas:
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.fuente
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.staticarchivos .cpp es solo para compatibilidad con versiones anteriores de C.Palabras clave
staticyvirtualno deben repetirse en la definición. Solo deben usarse en la declaración de clase.fuente
No necesita tener
staticuna definición de funciónfuente
Las funciones miembro estáticas deben referirse a variables estáticas de esa clase. Entonces en tu caso,
Como su función miembro
CP_StringToPstringes estática, los parámetros en esa función,inStringy tambiénoutStringdeben 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.
fuente