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ę?


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.


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.



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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.