Definir método estático no arquivo de origem com declaração no arquivo de cabeçalho em C ++


142

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?


2
Primeiro de tudo, você deve remover a staticpalavra - chave no arquivo .cpp. C ++ não permite isso.
Fezvez 12/05

10
@Fezvez: Como alternativa, substitua-o por /* static */. Eu gosto de ter os mesmos modificadores e argumentos padrão nos arquivos .h e .cpp.
David Thornley

2
TL; DR: Mantenha staticno arquivo de cabeçalho .h, significa "anexado à classe, não a nenhum objeto", remova staticno .cpparquivo, tem um significado diferente que você não deseja aqui.
Stéphane Gourichon

Respostas:


228

Remova a staticpalavra-chave na definição do método. Mantenha-o apenas na sua definição de classe.

staticA 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.


1
Ah, entendi que staticna 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.
ABV

14
Não outros métodos de classe, mas outras funções no arquivo .cpp. Você não deve fazer isso em C ++ de qualquer maneira. Se você deseja que uma função C ++ tenha vinculação interna, considere colocá-la em algum espaço para nome anônimo. Uso de staticem arquivos .cpp é apenas para compatibilidade com C.
x13n

1
Apenas por curiosidade ... Se eu definir um membro da classe estática diretamente na classe (no arquivo .h), como eu poderia usar a ligação estática?
Lumbric #

Você não pode. E não faz sentido fazê-lo, pois vincular o programa faria com que externos não resolvidos aparecessem.
x13n

41

Palavras static- chave e virtualnão devem ser repetidas na definição. Eles devem ser usados ​​apenas na declaração de classe.


11

Você não precisa ter staticna definição de função


-3

As funções de membro estático devem se referir a variáveis ​​estáticas dessa classe. Então, no seu caso,

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

Como sua função membro CP_StringToPstringé estática, os parâmetros nessa função inStringeoutString 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.


2
inString e outString são argumentos da função estática. Eles não são membros da classe. Não há necessidade de convertê-los para estáticos.
999k

Isso não está correto. Você pode colocar argumentos não estáticos em uma função de membro estático. Porém, dos membros da classe, você pode acessar / modificar apenas os estáticos na função.
Zachary Kraus
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.