J'ai un peu de mal à travailler avec des méthodes statiques en C ++
Exemple .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);
};
Exemple .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;
}
}
Je voulais passer un appel comme:
IC_Utility::CP_StringToPString(directoryNameString, directoryName );
Mais j'obtiens une erreur:
error: cannot declare member function 'static void IC_Utility::CP_StringToPString(std::string&, unsigned char*)' to have static linkage
Je ne comprends pas pourquoi je ne peux pas faire ça. Quelqu'un peut-il m'aider à comprendre pourquoi et comment réaliser ce que je veux?
static
mot - clé dans le fichier .cpp. C ++ ne le permet pas./* static */
. J'aime avoir les mêmes modificateurs et arguments par défaut dans les fichiers .h et .cpp.static
dans le fichier d'en-tête.h
, cela signifie "attaché à la classe, pas à un objet", supprimez-lestatic
dans le.cpp
fichier, cela a une signification différente que vous ne voulez pas ici.Réponses:
Supprimer le
static
mot-clé dans la définition de méthode. Gardez-le juste dans votre définition de classe.static
Le mot clé placé dans le fichier .cpp signifie qu'une certaine fonction a un lien statique, ie. il n'est accessible qu'à partir d'autres fonctions du même fichier.la source
static
la définition de la méthode signifierait que seules les autres méthodes de cette classe peuvent accéder à cette méthode statique, aucune autre méthode en dehors de cette classe.static
fichiers .cpp est juste pour la compatibilité descendante avec C.Mots clés
static
etvirtual
ne doit pas être répété dans la définition. Ils ne doivent être utilisés que dans la déclaration de classe.la source
Vous n'avez pas besoin d'avoir
static
une définition de fonctionla source
Les fonctions membres statiques doivent faire référence à des variables statiques de cette classe. Donc dans votre cas,
Étant donné que votre fonction membre
CP_StringToPstring
est statique, les paramètres de cette fonction,inString
etoutString
doivent être déclarées comme statiques aussi.Les fonctions membres statiques ne font pas référence à l'objet sur lequel elles travaillent, mais les variables que vous avez déclarées se réfèrent à son objet actuel et renvoient donc une erreur.
Vous pouvez soit supprimer la statique de la fonction membre, soit ajouter de la statique tout en déclarant les paramètres que vous avez utilisés pour la fonction membre comme statiques également.
la source