Definieren Sie die statische Methode in der Quelldatei mit der Deklaration in der Header-Datei in C ++

142

Ich habe ein kleines Problem mit statischen Methoden in C ++

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

};

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

Ich wollte einen Anruf tätigen wie:

IC_Utility::CP_StringToPString(directoryNameString, directoryName );

Aber ich bekomme eine Fehlermeldung:

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

Ich verstehe nicht, warum ich das nicht kann. Kann mir jemand helfen zu verstehen, warum und wie ich das erreichen kann, was ich will?

ABV
quelle
2
Zunächst sollten Sie das staticSchlüsselwort in der CPP-Datei entfernen . C ++ erlaubt es nicht.
Fezvez
10
@Fezvez: Alternativ ersetzen Sie es durch /* static */. Ich mag die gleichen Modifikatoren und Standardargumente in den .h- und .cpp-Dateien.
David Thornley
2
TL; DR: staticIn der Header-Datei behalten .h, bedeutet "an Klasse angehängt, nicht an ein Objekt", staticin der .cppDatei entfernen , es hat eine andere Bedeutung, die Sie hier nicht wollen.
Stéphane Gourichon

Antworten:

228

Entfernen Sie das staticSchlüsselwort in der Methodendefinition. Behalten Sie es einfach in Ihrer Klassendefinition.

staticSchlüsselwort in der CPP-Datei bedeutet, dass eine bestimmte Funktion eine statische Verknüpfung hat, dh. Es ist nur über andere Funktionen in derselben Datei zugänglich.

x13n
quelle
1
Ah, so verstanden staticin der Methodendefinition würde bedeuten, dass nur andere Methoden in dieser Klasse auf diese statische Methode zugreifen können, keine anderen Methoden außerhalb dieser Klasse.
ABV
14
Keine anderen Klassenmethoden, sondern andere Funktionen in der CPP-Datei. Sie sollten dies in C ++ sowieso nicht tun. Wenn eine C ++ - Funktion eine interne Verknüpfung haben soll, sollten Sie sie in einem anonymen Namespace platzieren. Die Verwendung von staticin .cpp-Dateien dient nur der Abwärtskompatibilität mit C.
x13n
1
Nur aus Neugier ... Wenn ich ein statisches Klassenmitglied direkt in der Klasse (in der .h-Datei) definiere, wie kann ich eine statische Verknüpfung verwenden?
Lumbric
Das kannst du nicht. Und es macht keinen Sinn, dies zu tun, da das Verknüpfen des Programms dazu führen würde, dass ungelöste externe Effekte auftreten.
x13n
41

Schlüsselwörter staticund virtualsollten in der Definition nicht wiederholt werden. Sie sollten nur in der Klassendeklaration verwendet werden.

Bo Persson
quelle
11

Sie müssen nicht staticin der Funktionsdefinition haben

cpx
quelle
-3

Statische Elementfunktionen müssen sich auf statische Variablen dieser Klasse beziehen. Also in deinem Fall,

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

Da Ihr Funktionselement CP_StringToPstringstatisch ist, die Parameter in dieser Funktion inStringund outStringsollen auch als statisch deklariert werden.

Die statischen Elementfunktionen beziehen sich nicht auf das Objekt, an dem gearbeitet wird, sondern die von Ihnen deklarierten Variablen beziehen sich auf das aktuelle Objekt, sodass ein Fehler zurückgegeben wird.

Sie können entweder die Statik aus der Elementfunktion entfernen oder Statik hinzufügen, während Sie die Parameter, die Sie für die Elementfunktion verwendet haben, ebenfalls als statisch deklarieren.

Prinz Aloies
quelle
2
inString und outString sind Argumente der statischen Funktion. Sie sind keine Klassenmitglieder. Sie müssen nicht in statische konvertiert werden.
999k
Das ist überhaupt nicht richtig. Sie können nicht statische Argumente in eine statische Elementfunktion einfügen. Von Klassenmitgliedern können Sie jedoch nur auf die statischen in der Funktion zugreifen / diese ändern.
Zachary Kraus