Zdefiniuj metodę statyczną w pliku źródłowym z deklaracją w pliku nagłówkowym w C ++

142

Mam mały problem z pracą z metodami statycznymi w C ++

Przykład .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);

};

Przykład .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;
    }
}

Chciałem zadzwonić na przykład:

IC_Utility::CP_StringToPString(directoryNameString, directoryName );

Ale pojawia się błąd:

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

Nie rozumiem, dlaczego nie mogę tego zrobić. Czy ktoś może mi pomóc zrozumieć, dlaczego i jak osiągnąć to, czego chcę?

ABV
źródło
2
Przede wszystkim należy usunąć staticsłowo kluczowe z pliku .cpp. C ++ na to nie pozwala.
Fezvez
10
@Fezvez: Alternatywnie, zamień go na /* static */. Lubię mieć te same modyfikatory i domyślne argumenty w plikach .h i .cpp.
David Thornley
2
TL; DR: Zachowaj staticw pliku nagłówkowym .h, czyli "dołączony do klasy, a nie do żadnego obiektu", usuń staticw .cpppliku, ma inne znaczenie, którego tutaj nie chcesz.
Stéphane Gourichon

Odpowiedzi:

228

Usuń staticsłowo kluczowe w definicji metody. Zachowaj to tylko w definicji swojej klasy.

staticsłowo kluczowe umieszczone w pliku .cpp oznacza, że ​​dana funkcja ma statyczne powiązanie, tj. jest dostępny tylko z innych funkcji w tym samym pliku.

x13n
źródło
1
Ach, staticrozumiem, że definicja metody oznacza, że ​​tylko inne metody w tej klasie mają dostęp do tej metody statycznej, a żadne inne metody poza tą klasą.
ABV
14
Nie inne metody klas, ale inne funkcje w pliku .cpp. I tak nie powinieneś tego robić w C ++. Jeśli chcesz, aby funkcja C ++ miała wewnętrzne powiązanie, powinieneś rozważyć umieszczenie jej w jakiejś anonimowej przestrzeni nazw. Wykorzystanie staticplików .cpp jest tylko dla wstecznej kompatybilności z C.
x13n
1
Z ciekawości… Jeśli zdefiniuję statycznego członka klasy bezpośrednio w klasie (w pliku .h), jak mogę użyć statycznego połączenia?
lumbric
Nie możesz. I nie ma sensu to robić, ponieważ połączenie programu ze sobą spowodowałoby pojawienie się nierozwiązanych zewnętrznych elementów.
x13n,
41

Słów kluczowych statici virtualnie należy ich powtarzać w definicji. Powinny być używane tylko w deklaracji klasy.

Bo Persson
źródło
11

Nie musisz mieć staticdefinicji funkcji

cpx
źródło
-3

Statyczne funkcje składowe muszą odwoływać się do zmiennych statycznych tej klasy. Więc w twoim przypadku

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

Ponieważ twoja funkcja członkowska CP_StringToPstringjest statyczna, parametry w tej funkcji inStringioutString powinny być również zadeklarowane jako statyczne.

Statyczne funkcje składowe nie odnoszą się do obiektu, na którym pracują, ale zadeklarowane zmienne odnoszą się do jego bieżącego obiektu, więc zwracają błąd.

Możesz usunąć statyczną z funkcji składowej lub dodać statyczną podczas deklarowania parametrów użytych dla funkcji składowej jako statyczne.

Książę Aloies
źródło
2
inString i outString to argumenty funkcji statycznej. Nie są członkami klasy. Nie ma potrzeby przekształcania ich w statyczne.
999 tys.
To wcale nie jest poprawne. W statycznej funkcji składowej można umieścić argumenty niestatyczne. Ale z członków klasy możesz uzyskać dostęp / modyfikować tylko statyczne w funkcji.
Zachary Kraus