Carte statique en tant que Membre de la Classe en C++
J'ai de la difficulté à l'aide d'une carte statique en tant que membre C++. Mon fichier d'en-tête est:
class Article
{
public:
//
static map<string,Article*> dictionary;
....
....
};
Dans mon constructeur, j'appelle la suite de la méthode d'abord:
void Article::InitializeDictionary()
{
#ifndef DICT
#define DICT
map<string,Article*> Article::dictionary;
#endif
}
Basée sur d'autres posts sur ce que je suis censé déclarer le membre statique mais quand j'essaie de faire cela, j'obtiens l'erreur suivante:
Error 1 error C2655: 'Article::dictionary' : definition or redeclaration illegal in current scope c:\.......\article.cpp 88 1
Si je change de fonction à la suivante:
void Article::InitializeDictionary()
{
#ifndef DICT
#define DICT
Article::dictionary["null"] = 0;
#endif
}
J'obtiens cette erreur:
Error 1 error LNK2001: unresolved external symbol "public: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class Article *,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class Article *> > > Article::dictionary" (?dictionary@Article@@2V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAVArticle@@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAVArticle@@@std@@@2@@std@@A)
Toutes les idées sur ce que je peux faire?
Vous ne pouvez pas définir le membre statique dans une méthode
Si je le déclarer dans le fichier d'en-tête après la déclaration de la classe j'obtiens la même erreur.
double possible de Undefined reference to membre de classe statique
Si je le déclarer dans le fichier d'en-tête après la déclaration de la classe j'obtiens la même erreur.
double possible de Undefined reference to membre de classe statique
OriginalL'auteur Kyle | 2013-10-12
Vous devez vous connecter pour publier un commentaire.
Vous avez de bien déclarer et définir membre statique (cette méthode est mauvaise):
Vous ai demandé dans les commentaires:
Depuis les membres statiques sont partagés entre TOUTES les instances d'une classe, ils doivent être définis dans un et un seul unité de compilation (lieu). Vraiment, ils sont des variables globales avec certaines restrictions d'accès.
Si vous essayez de le définir dans l'en-tête, elles seront définies dans chaque module comprend que l'en-tête, et vous obtiendrez des erreurs lors de la mise en retrouve tous les doublons de définitions.
consultez la mise à jour
OriginalL'auteur 4pie0
Il n'y a rien de mal avec votre déclaration de l'électricité statique dans votre classe.
Cependant, vous devez indiquer au compilateur de stockage de réserve pour le membre statique: vous devez définir. Pour ce faire inclure la ligne
dans exactement un unité de compilation et à mondiale portée; c'est à dire pas une méthode ou un espace de noms.
La chose normale à faire est de mettre cette ligne dans le source fichier associé à votre
Article
classe. Si vous mettez la ligne dans un fichier d'en-tête, puis plusieurs unités de compilation pourrait le définir qui vous donnera les erreurs de lien. Ce sera le cas, même avec inclure des gardes.Il est important de noter que l'initialisation de l'
map
va se produire avant que le programme demain
fonction est exécuté.OriginalL'auteur Bathsheba