IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Static template et fiasco d'initialisation


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Novembre 2014
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Static template et fiasco d'initialisation
    Bonjour,
    J'ai une classe template qui possède une variable static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <typename T> class ConstructableBase {
    public:
            static T* get(std::string const& name) {
                     std::cout << _type << std::endl;
                     return //autre chose pas important
            }
    protected:
    	static std::string _type;	
    };
    et j'ai différente classe qui hérite de celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Tile : public ConstructableBase<Tile> { };
     
    template <typename T> std::string ConstructableBase<T>::_type = "tile";
    Du coup je défini une fois ma variable static pour chaque implémentation.

    Le problème c'est, est-ce que ça ne va pas posé un problème avec l'initialisation des variables ?

    Ps:
    J'avais pensé à une approche pour résoudre ce problème qui consisté à mettre dans la classe Base une méthode virtuelle pure qui serait implémenté par chaque classe, sauf que dans ma méthode static j'aurais eu besoin de créer un objet pour ensuite appelé la méthode dessus.

    Du coup j'aimerais savoir :
    - Est-ce que le premier problème en est bien un et si oui comment le résoudre
    - Quelle méthode est la meilleure

    Merci de votre aide !

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Peut-être devrais-tu nous montrer qui représente un peu plus ce que tu veux faire. La solution me semble très très bizarre, il y en a peut-être de meilleure, mais on ne connait pas ton problème de base.

    Pour se concentrer sur ce bout de code, quel soucis d'initialisation penses-tu avoir ? Qu'as-tu constaté ?

    Quelques remarques:
    - Une classe avec que des membres statiques, je ne vois pas l'intérêt, mais je pense que c'est une simplification à outrance de ton code.
    - Ne peux-tu pas avoir deux paramètres template ?
    - Je présume que _type ne change pas encore d'exécution ? Il devrait peut-être être const dans ce cas.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Sinon, l'une des méthodes les plus communes pour arriver à éviter le fiasco d'initialisation (pour autant que cela puisse se faire, car il y a des restrictions assez sévères sur cette possibilité, est de déclarer ta variable statique dans une fonction dont le but est de renvoyer cette variable, par exemple, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::string /* const */&  unNomExplicite(){
        static std::string temp{/* ... */};
        /* ... */
        return temp;
    }
    Comme tu ne peux plus disposer de la donnée qu'au travers de la fonction créée tu as la certitude que la donnée sera bien créée.

    Et, comme il s'agit d'une variable statique, tu as la certitude que ce sera toujours la même instance qui sera renvoyée
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    A ce que je sais, tu auras des fiascos d'init si tu as des objets globaux qui utilisent dans leur construction d'autres objets globaux. Par exemple tu pourrais avoir un fiasco si tu utilises std::cout dans la construction d'un objet global (construit avant le main). Mais std::cout est spécial et toujours construit en premier (si je me souviens bien..).

    J'ai pas très bien compris ce que tu voulais faire par contre. Une factory?

Discussions similaires

  1. Instanciation static template
    Par etienne.bezout dans le forum C++
    Réponses: 4
    Dernier message: 03/12/2010, 17h16
  2. initialisation static d'une liste
    Par maxvador dans le forum Langage
    Réponses: 6
    Dernier message: 13/10/2006, 10h29
  3. Réponses: 3
    Dernier message: 13/12/2005, 09h52
  4. Initialisation d'un menbre static de type CMap
    Par vanitom dans le forum MFC
    Réponses: 3
    Dernier message: 11/10/2005, 13h53
  5. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo