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?
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.
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 .
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";
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.