Static const string n'obtiendrez pas initialisé
J'ai quelques static const chaînes privées membres de ma classe C++. Je suis conscient de la déclaration .h et à la définition (et de l'initialisation).rpc pratique. Dans le constructeur de la classe, j'invoque une fonction qui utilise ces chaînes statiques. Étonnamment, lorsque dans le constructeur, les chaînes restent non initialisés (les cordes à vide), ce qui crée un problème.
Quelqu'un peut-il point de ce qui peut mal se passer ici? Je travaille avec l'utilisation de static const chaînes de tous les temps, mais n'a jamais couru dans de telles situations.
Mise à jour: m_data reste vide dans l'utilitaire(). J'ai une classe de Test de l'objet en tant que membre privé d'une autre classe.
Ici c'est une sorte de code que j'utilise:
//Test.h
class Test
{
public:
Test();
private:
void utility();
static const std::string m_data;
};
//Test.cpp
const std::string Test::m_data = "Data";
Test::Test()
{
utility();
}
void Test::utility()
{
//use m_data here
}
Mon hypothèse est que ce sont
std::string
objets (comme revêtue de la const char*
) et la classe de l'objet est à la portée globale et pour quelles raisons, se construit avant chaînes statiques 😉 autant que je peux le faire en l'absence de code.L'explication de la différence de
const char*
façon: stackoverflow.com/questions/459942/...Tandis que vous avez ajouté le code, vous avez oublié d'ajouter d'où vous appelez la
Test
constructeur.Pourquoi ne pas vous lancer à votre code dans le débogueur, l'arrêter au moment où l'erreur se produit, et puis après la pile ici. C'est la seule façon que nous allons croire que ce n'est pas une initialisation statique bug.
OriginalL'auteur | 2009-09-23
Vous devez vous connecter pour publier un commentaire.
Est l'objet de votre type de TEST global?
Si donc vous êtes alors en cours d'exécution dans le problème avec l'ordre d'initialisation.
ie.
La solution est d'utiliser une méthode statique pour obtenir la chaîne:
Ne la modification de votre code dans cette façon de résoudre le problème?
est-il un objet dans un espace de noms défini ou un membre statique d'une autre classe?
getData() est un membre privé ne devrait donc pas affecter votre code.
Si l'objet de test est créé dans une fonction qui est appelée par le constructeur d'un objet qui est mondial aura le même effet. En gros, si le Test::Test() est appelée avant que la main est entrée puis vous a donné un problème!
OriginalL'auteur Martin York
Êtes-vous définir en tant que tel?
Voir: Les données membres statiques (C++ seulement)
OriginalL'auteur dbrien
Basé sur le code actuel, je suppose que vous essayez de créer de Test global de l'instance, plus probablement dans un autre .fichier cpp. Semble que vous frappez la terrible initialisation statique afin fiasco. Il suffit de mettre: la global/statique-variables de membre dans une .fichier cpp sera initialisé dans l'ordre où elles sont définies. Aucune garantie n'est faite sur les variables globales différentes .fichiers cpp, vous ne pouvez pas compter sur var dans un fichier en cours d'initialisation avant ou après la variable globale dans un autre.
Ne que les autres classes ont une instance créée à l'échelle mondiale? (Répéter jusqu'à ce que vous frappez la racine de l'arborescence de la classe.)
OriginalL'auteur sbk
Est-ce que vous avez besoin?
Programme de Sortie: bla constructeur - chaîne initialisée à: Bonjour, Bla!
OriginalL'auteur Rajesh R Subramanian
Je mase une vérification du programme anbd il a bien fonctionné. Dans ce IDE êtes-vous travailler ?
Ce sur windows droit ?
Vous pouvez utiliser si je me suis trompé de rendre la définition si la classe elle-même où vous déclarer le membre, la raison car il est un const statique.
OriginalL'auteur Boris Raznikov
Je voudrais utiliser une approche différente:
Personnellement, je préfère ce "style" et il permettrait d'éliminer tous problèmes avec des données initialisées dans le constructeur à ce qui sera probablement le mineur coût de la construction de la chaîne pour chaque instance.
il n'y a aucun point en ayant une static const variable, sauf si vous avez un problème avec le temps qu'il faut pour initialiser les données (vous ne pouvez pas identifier jusqu'à ce que vous avez essayé). const données ne peut pas changer donc il n'a pas d'importance si elle est statique ou non, il sera toujours le même.
OriginalL'auteur Patrick