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ę?
c++
static-linking
ABV
źródło
źródło
static
słowo kluczowe z pliku .cpp. C ++ na to nie pozwala./* static */
. Lubię mieć te same modyfikatory i domyślne argumenty w plikach .h i .cpp.static
w pliku nagłówkowym.h
, czyli "dołączony do klasy, a nie do żadnego obiektu", usuństatic
w.cpp
pliku, ma inne znaczenie, którego tutaj nie chcesz.Odpowiedzi:
Usuń
static
słowo kluczowe w definicji metody. Zachowaj to tylko w definicji swojej klasy.static
sł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.źródło
static
rozumiem, ż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ą.static
plików .cpp jest tylko dla wstecznej kompatybilności z C.Słów kluczowych
static
ivirtual
nie należy ich powtarzać w definicji. Powinny być używane tylko w deklaracji klasy.źródło
Nie musisz mieć
static
definicji funkcjiźródło
Statyczne funkcje składowe muszą odwoływać się do zmiennych statycznych tej klasy. Więc w twoim przypadku
Ponieważ twoja funkcja członkowska
CP_StringToPstring
jest statyczna, parametry w tej funkcjiinString
ioutString
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.
źródło