2016-11-03 8 views
0

J'essaye d'assigner une valeur unique aux membres const static unsigned int, sans avoir à penser à assigner les bonnes valeurs moi-même (empêchant des erreurs humaines). J'ai créé une solution minimale pour les membres static unsigned int, mais je voudrais vraiment utiliser const à la place, parce que c'est plus rapide (et soigné).Comment affecter const static à une macro incrémentielle?

C'est ce que je suis venu avec:

// cat.h 
#define ANIMAL_INDEX 0 
#define GET_ANIMAL_INDEX (ANIMAL_INDEX (ANIMAL_INDEX + 1)) 

class Cat 
{ 
protected: 
    Cat(){} 
public: 
    const static unsigned int lynx = GET_ANIMAL_INDEX; // 0 
    const static unsigned int tiger = GET_ANIMAL_INDEX; // 1 
}; 

Ceci est juste un exemple, mais imaginez que j'aurais aimé 1000 animaux ou quelque chose.

Est-il possible de créer une macro qui s'incrémente chaque fois qu'elle est utilisée pour l'affectation ou dois-je créer un script qui génère le cat.h?

+0

C'est vraiment ce que [* énumérations *] (http://en.cppreference.com/w/cpp/language/enum) sont pour. –

+0

@Someprogrammerdude Je veux faire une énumération complexe capable de faire de l'héritage. Une classe dog.h aurait des constantes qui n'ont pas la même valeur que les constantes de la classe cat.h. De cette façon, je pourrais appeler Animal :: lynx et Animal :: corgi sans conflits de valeur. – oddRaven

+0

Quelle est la solution que vous avez? Ce ne peut pas être le code dans votre question, puisque ce code est erroné. L'exigence dans votre commentaire est important et devrait être dans la question elle-même. – rici

Répondre

0

Si vous êtes heureux de déplacer les définitions de vos constantes en dehors de leur classe, puis une fonction statique implémentation simple base permet de résoudre votre problème:

class UniqueIndex 
{ 
public: 
    static int getNext() 
    { 
     static int theIndex = 0; 
     return theIndex++; 
    } 
}; 

class Cat 
{ 
protected: 
    Cat(){} 
public: 
    const static unsigned int lynx; 
    const static unsigned int tiger; 
}; 

const unsigned int Cat::lynx = UniqueIndex::getNext(); 
const unsigned int Cat::tiger = UniqueIndex::getNext(); 

int main() 
{ 
    std::cout << Cat::lynx << ' ' << Cat::tiger << std::endl; //output: 0 1 
    return 0; 
} 
0

comment demander une Sa méconnaissance conception cela pourrait être, un automatique compteur peut être utile dans de nombreux cas, donc va ici ...

Ajouter une abstraction autour de l '"index" et laissez-nous gérer le comptage.
Ensuite, vos membres peuvent être des instances de ce "type d'indexation" à la place.

Quelque chose comme ceci:

class Index 
{ 
public: 
    Index() : idx(next()) {} 
    Index(const Index&) = delete; 
    Index& operator=(const Index&) = delete; 
    operator int() const { return idx; } 
private: 
    const int idx; 
    // Avoid the "static initialization order fiasco". 
    static int next() { static int i = 0; return i++;} 
}; 

struct A 
{ 
    const static Index idx; 
}; 

const Index A::idx; 

struct B 
{ 
    const static Index idx; 
    const static Index idx2; 
}; 

const Index B::idx; 
const Index B::idx2; 

int main() 
{ 
    cout << A::idx << " " << B::idx << " " << B::idx2 << endl; 
}