2015-11-17 4 views
1

Je souhaite avoir une classe simple représentant un objet avec un identifiant unique. Chaque nouvel objet obtient un identifiant supérieur à celui précédemment créé. Une chose importante à noter est que id pour chaque objet est constant, donc je suis obligé d'utiliser la liste d'initialisation. Pour une raison quelconque, je reçois une erreur à propos de la référence indéfinie: référence indéfinie à Test :: ID.Utilisation d'un membre de classe statique en tant que paramètre dans la liste d'initialisation

class Test 
{ 
    const int m_id; 
    static int ID; 
public: 
    Test() : m_id(ID++) 
    { 
     cout << "Created object with id: " << m_id << endl; 
    } 
}; 
  1. Pourquoi est-ce?
  2. Comment puis-je résoudre ce problème?
  3. Comment puis-je m'assurer que l'ID est pré-initialisé avec 0, donc je n'incrémente pas une variable non initialisée?
+0

Ce n'est pas une bonne idée d'utiliser des variables en majuscules – Slava

+0

Salut, merci pour le conseil ... Mais pourquoi? Est-ce à cause de la manière courante de nommer les consts en utilisant seulement les majuscules ou il y a une autre raison derrière cela? –

+1

Nommer les consts en utilisant des majuscules est anti-pattern qui provient de la création de constantes en utilisant le préprocesseur. La collision de noms avec le préprocesseur est difficile à attraper et difficile à maintenir, donc la création de constantes C++ et de variables en majuscules n'est pas une bonne idée. – Slava

Répondre

2

Vous devez réserver du stockage pour le statique dans une unité de traduction. Vous l'initialisez alors. Vous devez donc écrire

int Test::ID = 0; 

dans l'un de vos fichiers sources.

Envisagez de changer le type en std::atomic<int>. Cela améliorera la sécurité des threads de votre code.

+0

Merci, votre conseil m'a aidé. Je vais aussi jeter un oeil à std :: atomic. –