Definire il metodo statico nel file sorgente con la dichiarazione nel file header in C ++


142

Ho qualche problema a lavorare con i metodi statici in C ++

Esempio .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);

};

Esempio .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;
    }
}

Volevo fare una chiamata come:

IC_Utility::CP_StringToPString(directoryNameString, directoryName );

Ma ricevo un errore:

error: cannot declare member function 'static void IC_Utility::CP_StringToPString(std::string&, unsigned char*)' to have static linkage

Non capisco perché non posso farlo. Qualcuno può aiutarmi a capire perché e come ottenere ciò che voglio?


2
Prima di tutto, dovresti rimuovere la staticparola chiave nel file .cpp. C ++ non lo consente.
Fezvez,

10
@Fezvez: in alternativa, sostituirlo con /* static */. Mi piace avere gli stessi modificatori e argomenti predefiniti nei file .h e .cpp.
David Thornley,

2
TL; DR: Mantieni staticnel file di intestazione .h, significa "allegato alla classe, non a nessun oggetto", rimuovi staticnel .cppfile, ha un significato diverso che non vuoi qui.
Stéphane Gourichon,

Risposte:


228

Rimuovi la staticparola chiave nella definizione del metodo. Tienilo solo nella definizione della tua classe.

staticla parola chiave inserita nel file .cpp indica che una determinata funzione ha un collegamento statico, ad es. è accessibile solo da altre funzioni nello stesso file.


1
Ah, capito così staticnella definizione del metodo significherebbe che solo altri metodi in quella classe possono accedere a quel metodo statico, nessun altro metodo al di fuori di quella classe.
ABV,

14
Non altri metodi di classe, ma altre funzioni nel file .cpp. Non dovresti farlo in C ++ comunque. Se si desidera che una funzione C ++ abbia un collegamento interno, è consigliabile inserirla in uno spazio dei nomi anonimo. L'uso di staticfile .cpp è solo per compatibilità con le versioni precedenti di C.
x13n,

1
Solo per curiosità ... Se definissi un membro di classe statico direttamente nella classe (nel file .h), come potrei usare il collegamento statico?
lumbric

Non puoi. E non ha senso farlo, poiché collegare il programma insieme comporterebbe la visualizzazione di esterni non risolti.
x13n

41

Parole chiave statice virtualnon devono essere ripetute nella definizione. Dovrebbero essere usati solo nella dichiarazione di classe.


11

Non è necessario disporre staticdella definizione della funzione


-3

Le funzioni membro statiche devono fare riferimento a variabili statiche di quella classe. Quindi nel tuo caso,

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

Poiché la funzione membro CP_StringToPstringè statica, i parametri in quella funzione inStringe outStringdevono essere dichiarati anche statici.

Le funzioni membro statiche non si riferiscono all'oggetto su cui sta lavorando ma le variabili dichiarate si riferiscono al suo oggetto corrente, quindi restituisce un errore.

È possibile rimuovere la statica dalla funzione membro o aggiungere statica dichiarando anche i parametri utilizzati per la funzione membro come statici.


2
inString e outString sono argomenti della funzione statica. Non sono membri della classe. Non è necessario convertirli in statici.
999k,

Questo non è affatto corretto. È possibile inserire argomenti non statici in una funzione membro statica. Ma dei membri della classe, puoi accedere / modificare solo quelli statici nella funzione.
Zachary Kraus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.