Können Sie erklären, warum Sie die statische Klassenmemberfunktion in Ihrer CPP-Datei "NICHT" implementieren können? Irgendein Fehler? Es gibt normalerweise keine Einschränkung, wo Sie eine solche Funktion implementieren.
WinterTTr
7
@winterTTr, Die Frage stellte sich wahrscheinlich, weil die meisten Beispiele / Tutorials im Web kein separates Implementierungsbeispiel darstellen, sondern es im Header deklarieren und definieren. Zumindest die ersten sechs Treffer in meiner bevorzugten Suchmaschine für "C ++ static member function" machen das alle so und erklären nicht, wie Sie es für einen Anfänger in separaten Dateien implementieren.
Crobar
7
Wiederholen Sie das staticSchlüsselwort bei der Implementierung nicht . Schreiben Sie das staticSchlüsselwort nur in die Klassendefinition in der Header-Datei
SomethingSomething
@crobar, Sie haben Recht, dass es an Beispielen für mehrere Dateien mangelt. Ich bemühte mich, dies herauszufinden, und beschloss, Folgendes zu teilen:
Ja, Sie können statische Elementfunktionen in der * .cpp-Datei definieren. Wenn Sie es in der Kopfzeile definieren, behandelt der Compiler es standardmäßig als Inline. Dies bedeutet jedoch nicht, dass separate Kopien der statischen Elementfunktion in der ausführbaren Datei vorhanden sind. Bitte folgen Sie diesem Beitrag, um mehr darüber zu erfahren:
Werden statische Elementfunktionen in C ++ in mehreren Übersetzungseinheiten kopiert?
Wenn Sie es im Klassenkörper definieren, wird es automatisch als Standard festgelegt. Wenn es außerhalb der Klasse Körper in der Kopfzeile ist, war es besser gekennzeichnet werden entweder inlineoder templateoder werden Sie mehrere Definitionsfehler von dem Linker erhalten.
Ben Voigt
2
Sagen Sie in Ihrer Header-Datei foo.h
classFoo{public:staticvoid someFunction(params..);// other stuff}
Sagen Sie in Ihrer Implementierungsdatei foo.cpp
#include"foo.h"voidFoo::someFunction(params..){// Implementation of someFunction}
Sehr wichtig
Stellen Sie nur sicher, dass Sie das statische Schlüsselwort nicht in Ihrer Methodensignatur verwenden, wenn Sie die statische Funktion in Ihrer Implementierungsdatei implementieren.
@crobar, Sie haben Recht, dass es an Beispielen für mehrere Dateien mangelt. Deshalb habe ich beschlossen, Folgendes zu teilen, in der Hoffnung, dass es anderen hilft:
Die #includeDirektive bedeutet wörtlich "alle Daten in dieser Datei an diese Stelle kopieren". Wenn Sie also die Header-Datei einfügen, befindet sie sich in Textform in der Codedatei, und alles darin ist vorhanden, gibt oder nimmt die Wirkung anderer Anweisungen oder Makroersetzungen, wenn sich die Codedatei (jetzt als Kompilierungseinheit oder Übersetzungseinheit bezeichnet ) befindet vom Präprozessormodul an das Compilermodul übergeben.
Das heißt, die Deklaration und Definition Ihrer statischen Elementfunktion befanden sich die ganze Zeit über in derselben Datei ...
static
Schlüsselwort bei der Implementierung nicht . Schreiben Sie dasstatic
Schlüsselwort nur in die Klassendefinition in der Header-DateiAntworten:
Es ist.
test.hpp:
test.cpp:
Sie sind nicht immer inline, nein, aber der Compiler kann sie erstellen.
quelle
Versuche dies:
header.hxx:
class.cxx:
quelle
helper.hxx
helper.cxx
A.cxx
Weitere Informationen zum Umgang mit statischen Funktionen in c ++ finden Sie unter: Werden statische Elementfunktionen in c ++ in mehrere Übersetzungseinheiten kopiert?
quelle
Ja, Sie können statische Elementfunktionen in der * .cpp-Datei definieren. Wenn Sie es in der Kopfzeile definieren, behandelt der Compiler es standardmäßig als Inline. Dies bedeutet jedoch nicht, dass separate Kopien der statischen Elementfunktion in der ausführbaren Datei vorhanden sind. Bitte folgen Sie diesem Beitrag, um mehr darüber zu erfahren: Werden statische Elementfunktionen in C ++ in mehreren Übersetzungseinheiten kopiert?
quelle
inline
odertemplate
oder werden Sie mehrere Definitionsfehler von dem Linker erhalten.Sagen Sie in Ihrer Header-Datei foo.h
Sagen Sie in Ihrer Implementierungsdatei foo.cpp
Sehr wichtig
Stellen Sie nur sicher, dass Sie das statische Schlüsselwort nicht in Ihrer Methodensignatur verwenden, wenn Sie die statische Funktion in Ihrer Implementierungsdatei implementieren.
Viel Glück
quelle
@crobar, Sie haben Recht, dass es an Beispielen für mehrere Dateien mangelt. Deshalb habe ich beschlossen, Folgendes zu teilen, in der Hoffnung, dass es anderen hilft:
quelle
Sicher kannst du. Ich würde sagen, dass du solltest.
Dieser Artikel kann nützlich sein:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
quelle
Die
#include
Direktive bedeutet wörtlich "alle Daten in dieser Datei an diese Stelle kopieren". Wenn Sie also die Header-Datei einfügen, befindet sie sich in Textform in der Codedatei, und alles darin ist vorhanden, gibt oder nimmt die Wirkung anderer Anweisungen oder Makroersetzungen, wenn sich die Codedatei (jetzt als Kompilierungseinheit oder Übersetzungseinheit bezeichnet ) befindet vom Präprozessormodul an das Compilermodul übergeben.Das heißt, die Deklaration und Definition Ihrer statischen Elementfunktion befanden sich die ganze Zeit über in derselben Datei ...
quelle