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 :

Générateur, que générer ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut Générateur, que générer ?
    Bonsoir !
    J'aimerai développer un générateur de code C++, et pour cela l'utilisateur entre les diverses informations le tout dans un arbre hiérarchique. En gros l'utilisateur définit ses classes, namespace, constante, méthodes, attributs et le tout produit un ensemble de fichier .hpp/.cpp

    Par contre il y a une question à laquelle je n'arrive pas à trouver de solution élégante, admettons j'ai:
    + std (namespace)
    ----> string (classe)
    ----> vector (classe)
    ----> MAX_VECTOR_ELEMENT (constante)
    Si je n'avais pas la constante, j'aurai généré un .hpp pour string et vector. Mais j'ai la constante qui appartient à std, donc que devrais-je générer ? Avez-vous une idée ?

    Merci d'avance à tous, j'espère que cette question ne vous sembler pas inutile et stupide!

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum.

    Typiquement, les constantes doivent être définies... là où elles ont leur utilité.

    MAX_VECTOR_ELEMENT est, visiblement, une constante qui s'applique... à la classe vector, et c'est donc de ce coté là qu'il faut envisager de la définir

    Ensuite, la question qu'il faut se poser, c'est de savoir si cette constance est ou non "à usage interne" de la classe vector (comprend: si seules les fonctions de vector doivent la connaitre ou non).

    La réponse à cette question te permettra de déterminer s'il est préférable de la déclarer dans un le fichier d'en-tête ou si seule sa définition dans le fichier d'implémentation est nécessaire

    Ceci dit, cette manière d'envisager les choses doit être pondérée par le nombre de constantes dont tu envisages d'avoir besoin, et par les différents éléments qui devront y accéder.

    Il est donc *possible* que la solution qui consisterait à regrouper les différentes constantes au sein d'un seul et même fichier *puisse* s'avérer être une option intéressante
    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

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    Bonsoir, merci pour ta réponse!

    En fait, mon exemple n'était peut-être pas le plus explicite. Je voudrais pouvoir définir une constante dans un namespace, qui serait une constante du namespace. Donc pourquoi pas y acceder dans une des classes du namespace.

    Mon soucis, c'est: ok j'ai mon namespace, mais que faire pour la génération au niveau du "constante dans le namespace." Dois-je créer un fichier "namespace.hpp" et "namespace.cpp" où je déclare et initialise la constante ?

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Comme j'ai essayé de te le faire comprendre, tu dois la déclarer... là où elle est utile.

    Si ta constante est destinée à être utilisée par plusieurs classes, il est sans doute préférable de créer un fichier d'en-tête (que je nommerai pour l'exemple "constants.hpp) proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef CONSTANTS_HPP
    #define CONSTANTS_HPP
    namespace MonEspaceDeNoms
    {
    extern const int constante1;
    extern const int constante2;
    /*...*/
    } // namespace MonEspaceDeNoms
    #endif // CONSTANTS_HPP
    et un fichier d'implémentation (que je nommerai pour l'exemple "constants.cpp") proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    namespace MonEspaceDeNoms
    {
    const int constante1 = 123456;
    const int constante2 = 654321;
    /*...*/
    } // namespace MonEspaceDeNoms
    et d'inclure constants.hpp dans les fichiers d'en-tête qui en ont besoin.

    Par contre, si la constante n'est utile que pour une seule classe, définis la dans le fichier d'implémentation qui ... l'utilise, et déclare la éventuellement dans le fichiers d'en-tête ad-hoc, si c'est une constante à laquelle l'utilisateur doit avoir accès.
    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

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Par défaut
    D'accord, je pense comprendre.
    En fait il y a deux cas:

    + MonNamespace
    ----> MaClasse1
    ----> MaClasse2
    --------> MaConstante1
    ----> MaConstante2

    Ici MaConstante1 n'est accessible que dans MaClasse2, elle peut donc appartenir au .hpp/.cpp de ce dernier. Par contre MaConstante2 a une visibilité plus grande, et elle doit donc appartenir à un fichier réunissant les "constantes de namespace" qui sont en fait les constantes de l'application. C'est cela ?

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par S.Ockham Voir le message
    D'accord, je pense comprendre.
    En fait il y a deux cas:

    + MonNamespace
    ----> MaClasse1
    ----> MaClasse2
    --------> MaConstante1
    ----> MaConstante2

    Ici MaConstante1 n'est accessible que dans MaClasse2, elle peut donc appartenir au .hpp/.cpp de ce dernier. Par contre MaConstante2 a une visibilité plus grande, et elle doit donc appartenir à un fichier réunissant les "constantes de namespace" qui sont en fait les constantes de l'application. C'est cela ?
    On peut effectivement dire ça comme cela, oui...

    Le principe d'organisation des fichiers d'en-tête est simple:

    Chaque fichier ne doit exposer que le stricte minimum pour fournir les services que l'on attend de lui.

    La classe string, par exemple, est une classe qui fournit les services de... gestion des chaines de caractères.

    Il n'y aurait donc aucune raison valable pour qu'elle fournisse (du fait d'une inclusion de fichier) les services de... gestion de tableaux dynamiques (vector), par exemple.

    Or, il n'est pas impossibles que ces deux classes utilisent les mêmes constantes ou, étant donné qu'il s'agit de deux classes template (std::string n'est jamais qu'un typedef spécialisant la std::basic_string pour... les caractères "char_t"), qu'elles utilisent des politiques ou des traits de politiques identiques.

    On va donc séparer tout ce qui est commun aux std::string ou aux std::vector (voire, à d'autres classes encore) dans un (ou plusieurs !!!) fichier(s) clairement distincts, exposant chacun un aspect tout à fait particulier, et on incluera ces différents fichiers "partout où ce sera nécessaire" (dans le fichier <string> et / ou dans le fichier "vector" et / ou dans les autres fichiers qui en ont besoin).
    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

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    J'aimerai développer un générateur de code C++, et pour cela l'utilisateur entre les diverses informations le tout dans un arbre hiérarchique. En gros l'utilisateur définit ses classes, namespace, constante, méthodes, attributs et le tout produit un ensemble de fichier .hpp/.cpp
    Bonne chance, surtout si tu débutes (un générateur à squelette fixe n'est pas impossible mais demande quand même quelques bases).

    + std (namespace)
    ----> string (classe)
    ----> vector (classe)
    ----> MAX_VECTOR_ELEMENT (constante)
    Si je n'avais pas la constante, j'aurai généré un .hpp pour string et vector. Mais j'ai la constante qui appartient à std, donc que devrais-je générer ? Avez-vous une idée ?
    Pour faire simple: je ne comprends pas la question.
    Que vient faire la constante, quelle rôle joue-t-elle ?

    C'est p-e clair pour vous, mais pas pour nous.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. Générateur de dataset tel que le dataset de DARPA
    Par lichman dans le forum Intelligence artificielle
    Réponses: 0
    Dernier message: 28/06/2009, 13h21
  2. Réponses: 9
    Dernier message: 04/06/2009, 16h59
  3. Réponses: 0
    Dernier message: 04/08/2008, 15h15
  4. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 10h17
  5. Réponses: 2
    Dernier message: 20/01/2007, 16h25

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