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 :

"Tricky initialisation" (confirmé/expert)


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut "Tricky initialisation" (confirmé/expert)
    Bonsoir à tous et toutes!

    Suite à quelques idée, je souhaiterais effectuer une opération qui n'est pas par defaut autorisé par le c++, à savoir l'initialisation des structures statiques au prototypage...

    Exemple de ce qu'il faut normalement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A {
    private:
       struct Test {
       }
    public:
       static Test myTest;
    }
     
    Test A::myTest; //Déclaration
    (et la nous entrons dans la partie un peu plus "sale"):
    Les structures vide comme celle la permettent d'executer du code à l'initialisation du programme, comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A {
    private:
       struct Test {
            Test() {
                printf("S'executera avant la premiere ligne du main()");
            }
       };
    public:
       static Test myTest;
    };
     
    A::Test A::myTest; //Déclaration
    En évitant de parler de l'aspect "sale" du code (j'en suis parfaitement conscient, mais c'est une nécessité dans l'application que je souhaite developper), je souhaiterais pouvoir faire la même chose en déclarant directement et initialisant directement ma structure statique. Au départ j'étais parti sur un template:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    template<typename T>
    class _initializer {
      static T reference; //Objet à initialiser
    }
     
    template<typename T>
    T _initializer<T>::reference; //Déclaration de l'objet statique
     
    class A {
    private: 
    struct Test {
     Test() {
     }
    };
    public:
        typedef _initializer<Test>::reference _declarerPourInitialiser; //?
    };
    Bien évidement, ce genre de code ne fonctionne pas, l'objet s'initialisant uniquement si le typedef est utilisé au moins une fois dans le code de l'application.
    Or justement ces objets, l'utilisateur ne doit pas devoir les utiliser, ils existent uniquement pour forcer le compilo à executer du code avant le main()

    Quelqu'un aurait-il une idée (me suis-je bien fait comprendre au moins? )

    Je repete que oui ce code est sale (pas besoin de me le dire!), et que non je ne peu pas declarer hors de ma classe quoi que ce soit

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Pourquoi tu ne définis pas une simple variable globale limitée à ton unité de traduction ?
    Pas besoin de partir sur des trucs compliqués.

    PS: n'oublie pas que tu n'as aucun moyen d'assurer des dépendances entre ces données statiques ("statique" comme dans "static storage").
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    Justement:

    Je vais expliquer mon cas plus en detail:

    Je souhaite faire une macro qui me permet de declarer un champ de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CHAMP(Nom, Type) private: Type Nom;
    Mais qui en plus déclare une structure privée (que l'utilisateur n'utilisera pas) mais qui me permet d'ajouter le champ à un tableau de champ:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define CHAMP(Nom, Type) private: Type Nom; \
                                                   static struct _field_init_##Nom { \
                                                         _field_init_##Nom() { \
                                                                printf("Ajout de %s", #Nom); \
                                                                FieldManager::GetInstance()->Ajouter(#Nom, &Class::Nom); \
                                                         } \
                                                   }; \
    De ce fait, je souhaite par tout les moyens forcer l'initialisation au prototypage par une méthode la plus sale soit elle, afin que l'utilisateur n'est pas à déclarer une macro par champ en plus et ce hors de la classe...

  4. #4
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Salut,

    Désolé, je ne sais pas répondre à ta question.

    En revanche, ton dernier post me fait penser à des choses dans lesquelles j'ai déjà baigné. Il est possible que ce soit juste dans ma tête, car tu ne donnes pas tellement d'infos sur ce que tu souhaite faire.

    Quoi qu'il en soit, est-ce que la génération de code ne serait pas une forme de solution à tes problèmes ?

    Une moulinette qui transformerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TropLaClasse FooBar
    [
    protected :
    	int foo;
    	std::string bar;
    ]
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class FooBar_Generated_Do_Not_Touch
    {
    public :
    	FooBar_Generated_Do_Not_Touch();
    protected :
    	int foo;
    	std::string bar;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Class FooBar : public FooBar_Generated_Do_Not_Touch
    {
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MonGrosTableauDeChamps::MonGrosTableauDeChamps()
    {
    	unChamp["FooBar"]["foo"] = "int";
    	unChamp["FooBar"]["bar"] = "std::string";
    }
    [EDIT]Je viens de rééditer la plus grosse partie du code, ça ne voulait rien dire avant... je vais ptet aller boire un café moi.
    [/EDIT]

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    Effectivement en realité je souhaite developper un moteur de reflection (comme les langages managé) en c++

    Et ce probleme semble etre le seul que je ne puisse résoudre

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Woaw.

    Et bien désolé de ne pas être plus utile.
    Et courage ! Ce n'est pas un problème simple auquel tu t'attaques.

    Pour ma part, je crois que quitte à forcer l'utilisateur à utiliser ce genre de syntaxe :
    plutôt que :
    Autant lui proposer carrément un autre langage ou méta-langage qui, pourquoi pas, ressemblerait à du C++ et serait "compilé" en C++ (qu'il faudrait compiler à son tour).

    Reste que parser du C++, c'est touchy.

    En tout cas : bonne chance.

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Passer un préprocesseur (qui te génère ce que tu cherches) me paraitrait moins lourd.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Je n'ai jamais compris l'intérêt de la réflection à l'exécution.
    C'est tellement plus utile à la compilation, et tellement moins intrusif...
    Boost ftw

  9. #9
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Je n'ai jamais compris l'intérêt de la réflection à l'exécution.
    C'est tellement plus utile à la compilation, et tellement moins intrusif...
    Je crois que tu ouvres un autre débat.

  10. #10
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    Hop, je prend note de vos remarques => Est-ce possible d'integrer une moulinette au niveau de gcc juste avant le preprocessing?
    Je veux dire sans mouliner les fichiers mais directement les flux?

    Car si je dois mouliner les fichiers sa demande à enregistrer une seconde version du fichier cpp/h à chaque compilation... :-/

  11. #11
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Passer un préprocesseur (qui te génère ce que tu cherches) me paraitrait moins lourd.
    Tout à fait d'accord. Et dans ce cas il faut mouliner chacun de tes fichiers... (facilité grâce aux makefiles)

    Citation Envoyé par loufoque Voir le message
    Je n'ai jamais compris l'intérêt de la réflection à l'exécution.
    C'est tellement plus utile à la compilation, et tellement moins intrusif...
    Tout à fait.

    On en avait déjà parlé ici avec loufoque : Boost.MPL couplé à une profonde compréhension de son mécanisme permettent d'aller très très loin.

    Une recherche sur le mot clé "réflexion" en rajoutant peut-être "MPL" devrait t'amener à de telles discussions.

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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