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?


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.


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.


11

Sie müssen nicht staticin der Funktionsdefinition haben


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.