web-dev-qa-db-fra.com

Comment définir des constantes de chaîne en C ++?

Duplicata possible:
chaîne constante statique C++ (membre de la classe)
n membre de classe C++ const statique initialisé donne une erreur de symbole en double lors de la liaison

Mon expérience avec C++ était antérieure à l'ajout de la classe de chaînes, donc je recommence à certains égards.

Je définis mon fichier d'en-tête pour ma classe et je veux créer une constante statique pour une URL. J'essaye ceci en faisant comme suit:

#include <string>
class MainController{
private:
    static const std::string SOME_URL;
}

const std::string MainController::SOME_URL = "www.google.com";

Mais cela me donne une définition en double lors du lien.

Comment puis-je accomplir cela?

18
Thom

Bouge le

const std::string MainController::SOME_URL = "www.google.com";

dans un fichier cpp. Si vous l'avez dans un en-tête, alors chaque .cpp qui l'inclut aura une copie et vous obtiendrez l'erreur de symbole en double pendant le lien.

13
David Nehme

Vous devez mettre la ligne

const std::string MainController::SOME_URL = "www.google.com";

dans le fichier cpp, pas dans l'en-tête, à cause de la règle à une définition . Et le fait que vous ne pouvez pas l'initialiser directement dans la classe est dû au fait que std::string n'est pas un type intégral (comme int).

Alternativement, selon votre cas d'utilisation, vous pourriez envisager de ne pas créer de membre statique mais d'utiliser un espace de noms anonyme à la place. Voir cet article pour le pour/le contre .

11
JRL

Définissez la classe dans le fichier d'en-tête:

//file.h
class MainController{
private:
    static const std::string SOME_URL;
}

Et puis, dans le fichier source:

//file.cpp
 #include "file.h"

const std::string MainController::SOME_URL = "www.google.com";
3
Nawaz

Vous devez mettre le const std::string MainController::SOME_URL = "www.google.com"; définition dans un seul fichier source, pas dans l'en-tête.

2
Mark B