2016-03-05 2 views
-1

J'essaie de séparer mon code C++ en un en-tête et un fichier cpp, mais l'interpréteur montre quelques erreurs.C++ .h et .cpp fichier séparé

Voici mon code:

Password.h:

#ifndef PASSWORD_H 
#define PASSWORD_H 

class Password { 
private: 
    string aliasName_; 
    int hashOfPassword_; 
public: 
    void setAliasName(string aliasName); 
    void setHashOfPassword(int hashOfPassword); 
    string getAliasName() { return aliasName_; } 
    int getHashOfPassword() { return hashOfPassword_; } 
}; 

#endif 

Password.cpp:

#include <string> 
#include "Password.h" 

using std::string; 

void Password::setAliasName(string aliasName) { 
    aliasName_ = aliasName; 
} 
void Password::setHashOfPassword(int hashOfPassword) { 
    hashOfPassword_ = hashOfPassword; 
} 

Erreurs:

Error C2065 'aliasName_': undeclared identifier X\password.cpp 7 
Error C2511 'void Password::setAliasName(std::string)': overloaded member function not found in 'Password' X\password.cpp 6 
Error C3646 'aliasName_': unknown override specifier X\password.h 6 
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int X\password.h 6 
Error C2061 syntax error: identifier 'string' X\password.h 9 
Error C3646 'getAliasName': unknown override specifier X\password.h 11 
Error C2059 syntax error: '(' X\password.h 11 
Error C2334 unexpected token(s) preceding '{'; skipping apparent function body X\password.h 11 

Vous avez des idées?

+6

Vous devez ajouter 'en utilisant std :: string;' ou utiliser 'std :: string' dans votre en-tête. –

+2

Avez-vous entendu parler de 'const'? –

+0

Merci Mats Petersson, ça marche bien! :-) – Gabor

Répondre

3

Vous devez déplacer using std::string avant la déclaration de votre classe:

#ifndef PASSWORD_H 
#define PASSWORD_H 

#include <string> 

using std::string; 

class Password { 
… 

et le supprimer de votre fichier .cpp.

En outre, vous pouvez utiliser #pragma once au lieu de la #ifndef/#define/#endif traditionnelle et enfin, vous voudrez peut-être faire votre argument et vos méthodes const lorsque vous en avez besoin.

+0

Merci Zmo à votre réponse rapide :) – Gabor

+0

pas de problème, si cela vous a aidé, n'hésitez pas à +1 et l'accepter ;-) – zmo

+0

Je pensais que l'utilisation de 'using' dans les fichiers d'en-tête serait mauvais entraine toi. Mais je pense que ce n'est pas vraiment important si ce n'est pas une bibliothèque. Une autre chose: je ne savais pas que '#pragma once' est supporté par GCC. La dernière fois que j'ai cherché, j'ai seulement vu que c'est une extension de VC. Mais [ce thread] (http://stackoverflow.com/q/1143936/4967497) dit qu'il est supporté par tous les compilateurs courants. O.o – JojOatXGME

1

Vous devez déplacer

#include <string> 
using std::string; 

à l'intérieur Password.h, vous pouvez supprimer ces deux lignes de Password.cpp.

0

Il suffit d'ajouter à chaque std::string dans votre fichier d'en-tête et rappelez-vous, vous ne devez jamais utiliser using ou using namespace là! Vous devez également inclure tous les en-têtes dans le fichier dans lequel vous les utilisez.