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.