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
static
palabra 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.static
en el archivo de encabezado.h
, significa "adjunto a la clase, no a ningún objeto", eliminarstatic
en el.cpp
archivo, tiene un significado diferente que no desea aquí.Respuestas:
Eliminar la
static
palabra clave en la definición del método. Manténgalo solo en la definición de su clase.static
La 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
static
en 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.static
archivos .cpp es solo para compatibilidad con versiones anteriores de C.Palabras clave
static
yvirtual
no deben repetirse en la definición. Solo deben usarse en la declaración de clase.fuente
No necesita tener
static
una 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_StringToPstring
es estática, los parámetros en esa función,inString
y tambiénoutString
deben 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