Pourriez-vous expliquer pourquoi vous "NE POUVEZ PAS" implémenter la fonction memeber de classe statique dans votre fichier cpp? une erreur? Il n'y a généralement aucune limitation quant à l'emplacement de mise en œuvre de cette fonction.
winterTTr
7
@winterTTr, La question s'est probablement posée parce que la plupart des exemples / tutoriels sur le Web ne présentent pas d'exemple d'implémentation séparé, mais le déclarent et le définissent dans l'en-tête. Au moins les six premiers résultats de mon moteur de recherche préféré pour la "fonction membre statique C ++" le font tous de cette façon et n'expliquent pas comment vous l'implémentez dans des fichiers séparés pour un novice.
crobar
8
Lorsque vous implémentez, ne répétez pas le staticmot - clé. Écrivez le staticmot - clé uniquement dans la définition de classe dans le fichier d'en-tête
SomethingSomething
@crobar, vous avez raison de dire qu'il y a une pénurie d'exemples multi-fichiers. J'ai eu du mal à comprendre cela, alors j'ai décidé de partager ce qui suit:
Oui, vous pouvez définir des fonctions membres statiques dans le fichier * .cpp. Si vous le définissez dans l'en-tête, le compilateur le traitera par défaut comme en ligne. Cependant, cela ne signifie pas que des copies séparées de la fonction membre statique existeront dans l'exécutable. Veuillez suivre cet article pour en savoir plus à ce sujet:
Les fonctions membres statiques en C ++ sont-elles copiées dans plusieurs unités de traduction?
Si vous le définissez dans le corps de la classe, il sera automatiquement par défaut. S'il se trouve dans l'en-tête en dehors du corps de la classe, il vaut mieux le marquer inlineou templateou vous obtiendrez plusieurs erreurs de définition de l'éditeur de liens.
Ben Voigt
2
Dans votre fichier d'en-tête, dites foo.h
classFoo{public:staticvoid someFunction(params..);// other stuff}
Dans votre fichier d'implémentation, dites foo.cpp
#include"foo.h"voidFoo::someFunction(params..){// Implementation of someFunction}
Très important
Assurez-vous simplement de ne pas utiliser le mot-clé static dans la signature de votre méthode lorsque vous implémentez la fonction statique dans votre fichier d'implémentation.
@crobar, vous avez raison de dire qu'il y a une pénurie d'exemples multi-fichiers, j'ai donc décidé de partager ce qui suit dans l'espoir que cela aide les autres:
La #includedirective signifie littéralement "copier toutes les données de ce fichier à cet endroit". Ainsi, lorsque vous incluez le fichier d'en-tête, il est textuellement dans le fichier de code, et tout ce qu'il contient sera là, donner ou prendre l'effet d'autres directives ou remplacements de macro, lorsque le fichier de code (maintenant appelé unité de compilation ou unité de traduction ) est transféré du module préprocesseur au module du compilateur.
Ce qui signifie que la déclaration et la définition de votre fonction membre statique étaient vraiment dans le même fichier depuis le début ...
static
mot - clé. Écrivez lestatic
mot - clé uniquement dans la définition de classe dans le fichier d'en-têteRéponses:
C'est.
test.hpp:
test.cpp:
Ils ne sont pas toujours en ligne, non, mais le compilateur peut les créer.
la source
Essaye ça:
header.hxx:
class.cxx:
la source
helper.hxx
helper.cxx
A.cxx
Pour en savoir plus sur la façon dont C ++ gère les fonctions statiques, visitez: Les fonctions membres statiques en C ++ sont-elles copiées dans plusieurs unités de traduction?
la source
Oui, vous pouvez définir des fonctions membres statiques dans le fichier * .cpp. Si vous le définissez dans l'en-tête, le compilateur le traitera par défaut comme en ligne. Cependant, cela ne signifie pas que des copies séparées de la fonction membre statique existeront dans l'exécutable. Veuillez suivre cet article pour en savoir plus à ce sujet: Les fonctions membres statiques en C ++ sont-elles copiées dans plusieurs unités de traduction?
la source
inline
outemplate
ou vous obtiendrez plusieurs erreurs de définition de l'éditeur de liens.Dans votre fichier d'en-tête, dites foo.h
Dans votre fichier d'implémentation, dites foo.cpp
Très important
Assurez-vous simplement de ne pas utiliser le mot-clé static dans la signature de votre méthode lorsque vous implémentez la fonction statique dans votre fichier d'implémentation.
Bonne chance
la source
@crobar, vous avez raison de dire qu'il y a une pénurie d'exemples multi-fichiers, j'ai donc décidé de partager ce qui suit dans l'espoir que cela aide les autres:
la source
Sûr que vous pouvez. Je dirais que tu devrais.
Cet article peut être utile:
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
la source
La
#include
directive signifie littéralement "copier toutes les données de ce fichier à cet endroit". Ainsi, lorsque vous incluez le fichier d'en-tête, il est textuellement dans le fichier de code, et tout ce qu'il contient sera là, donner ou prendre l'effet d'autres directives ou remplacements de macro, lorsque le fichier de code (maintenant appelé unité de compilation ou unité de traduction ) est transféré du module préprocesseur au module du compilateur.Ce qui signifie que la déclaration et la définition de votre fonction membre statique étaient vraiment dans le même fichier depuis le début ...
la source