Estou com problemas para trabalhar com métodos estáticos em C ++
Exemplo .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);
};
Exemplo .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;
}
}
Eu queria fazer uma ligação como:
IC_Utility::CP_StringToPString(directoryNameString, directoryName );
Mas eu recebo um erro:
error: cannot declare member function 'static void IC_Utility::CP_StringToPString(std::string&, unsigned char*)' to have static linkage
Não entendo por que não posso fazer isso. Alguém pode me ajudar a entender por que e como alcançar o que eu quero?
c++
static-linking
ABV
fonte
fonte
static
palavra - chave no arquivo .cpp. C ++ não permite isso./* static */
. Eu gosto de ter os mesmos modificadores e argumentos padrão nos arquivos .h e .cpp.static
no arquivo de cabeçalho.h
, significa "anexado à classe, não a nenhum objeto", removastatic
no.cpp
arquivo, tem um significado diferente que você não deseja aqui.Respostas:
Remova a
static
palavra-chave na definição do método. Mantenha-o apenas na sua definição de classe.static
A palavra-chave colocada no arquivo .cpp significa que uma determinada função tem uma ligação estática, ou seja. só é acessível a partir de outras funções no mesmo arquivo.fonte
static
na definição do método significaria que apenas outros métodos nessa classe podem acessar esse método estático, nenhum outro método fora dessa classe.static
em arquivos .cpp é apenas para compatibilidade com C.Palavras
static
- chave evirtual
não devem ser repetidas na definição. Eles devem ser usados apenas na declaração de classe.fonte
Você não precisa ter
static
na definição de funçãofonte
As funções de membro estático devem se referir a variáveis estáticas dessa classe. Então, no seu caso,
Como sua função membro
CP_StringToPstring
é estática, os parâmetros nessa funçãoinString
eoutString
devem ser declarados como estáticos.As funções de membro estático não se referem ao objeto em que estão trabalhando, mas as variáveis declaradas se referem ao objeto atual e, portanto, retornam erros.
Você pode remover a estática da função de membro ou adicionar estática enquanto declara os parâmetros usados para a função de membro como estática também.
fonte