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 :

Namespace et inclusion de classes


Sujet :

C++

  1. #1
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut Namespace et inclusion de classes
    Bonjour,

    J'ai plusieurs classes outils que je voudrais regrouper dans une classe ou dans un namespace Outils.

    Mes outils sont des classes normales :
    Une classe A avec son .h et .cpp
    Une classe B avec son .h et .cpp

    Je voudrais appeler mes classes et leurs méthodes (toutes statiques) de cette manière :

    Outil::A::MethodeDeA();
    Outil::B::MethodeDeB();

    Que choisir, namespace ou classe ?
    Dans les deux cas comment faire pour inclure des classes déjà définies (.h et .cpp) dans un namespace ou une classe. Je n'ai pas trouvé d'exemples.

    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
     
    #include "a.h"
    #include "b.h"
     
    namespace Outils
    {
       ....//Quoi mettre ??
    }
     
    // Ou bien avec une classe
     
    class Outils
    {
       ....//Quoi mettre ??
    };

    Merci.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Les namespaces, je les utilise comme classement de haut niveau, en général mes fonctions, même statiques, sont dans une classe - surtout quand elles sont génériques -.

    Pour ta deuxième question, c'est dans les .h et les .cpp qu'on ajoute les namespace, on ne le fait jamais à l'extérieur des fichiers dans lesquels les classes et fonctions ont été définies. C'est la porte ouverte aux erreurs d'édition des liens, de compilation, ...

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Si tu veux regrouper A et B sous forme d'un héritage par exemple, ou créer des classes personnelles qui dérivent de l'une ou l'autre, tu a intéret à utiliser des classes...

    Si, parce que les classes A et B se trouvent dans des espaces de nommages (trop) différents, tu veux "simplement" les mettre toutes les deux dans le meme espace de nommage pour la facilité, tu peux envisager de les rajouter à ton espace de nommage sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef TON_FICHIER_ENTETE_H
    #define TON_FICHIER_ENTETE_H
    #include "classea.h"
    #include "classb.h"
    namespace espacedenommage
    {
        using ::ClasseA;// à adapter selon l'espace de nomage dans lequel elle se
                             //trouve
        using ::ClasseB; //idem
    };
    ou, pour les structure venant du C, un peu comme ce qui se fait dans ctime
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #include <cstddef>
     
    #include <time.h>
     
    // Get rid of those macros defined in <time.h> in lieu of real functions.
    #undef clock
    #undef difftime
    #undef mktime
    #undef time
    #undef asctime
    #undef ctime
    #undef gmtime
    #undef localtime
    #undef strftime
     
    namespace std
    {
      using ::clock_t;
      using ::time_t;
      using ::tm;
     
      using ::clock;
      using ::difftime;
      using ::mktime;
      using ::time;
      using ::asctime;
      using ::ctime;
      using ::gmtime;
      using ::localtime;
      using ::strftime;
    }
    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 confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    Merci pour vos réponses, je sais donc maintenant le faire avec les namespaces.

    Par contre j'en reviens aux classes (ma première idée au départ), je pense que ce qu'il me manque c'est plus la syntaxe qu'autre chose. On fait habituellement :

    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
     
    class Outil
    {
    public:
     
        class A
        {
        public:
            static void maMethodeA();
        }
        class B
        {
        public:
            static void maMethodeB();
        }
     
    };
    On peut ensuite appeler nos méthodes par Outil::A::maMethodeA();

    Moi mes classes sont déclarés dans des .h et .cpp externes à outil.h, alors comment faire pour les amener dans la classe Outil ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Outil
    {
    public:
         // Que mettre ici ?
    };
    A la base je n'avais qu'une classe Outil et mes fichiers .h et cpp sont devenus trop gros. J'ai donc pensé à regrouper les outils de fonctions proches dans des classes dédiées, puis regrouper toutes les classes dans une classe générique Outil (ou un namespace, c'est de la que venait mon questionnement).

    Merci.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Dans ton cas, c'est plus un namespace qu'une classe.
    Si tu fais ça avec des classes, tu feras des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Outil::A::mamethodeA()
    {
    }
    Et avec des namespaces, ça sera beaucoup plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace Outil
    {
      namespace A
      {
        void mamethoedeA()
        {
        }
      }
    }

  6. #6
    Membre confirmé Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Par défaut
    Merci Miles. Finalement j'ai utilisé un namespaces Outil pour rassembler toutes mes classes dedans et ca fonctionne parfaitement.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Surtout l'enorme interêt est de garder la terminologie de la 'classe' d'objet.
    Dans le cas présent "Outil" ne représente pas un objet à part entière, ce n'est donc pas une classe.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    En fait, il faut bien comprendre que le terme classe a pour but de représenter un objet complet et indépendant (ou une partie d'objet, dans certains cas)...

    L'espace de nommage a pour but de regrouper un certain nombre d'objets indépendants mais ayant trait à un concept générique, à un objectif global unique...

    Par exemple: std n'est pas une classe, mais est un espace de nommage qui regroupe... tout ce qui est fournis "en standard", pareil pour QT, qui regroupe... tout ce qui permet de créer des interfaces graphiques (entre autres)...

    Maintenant, comme je l'ai indiqué plus haut, rien n'empeche que, lors de ta conception, tu puisse te rendre compte qu'il est intéressant de regrouper des choses aussi différentes qu'une tasse et que du verre dans une meme classe pour en créer un objet indépendant qui soit à la fois tasse et verre... auquel cas, c'est bel et bien une classe qu'il faudra utiliser, avec un mécanisme d'héritage, par exemple...

    Tout comme rien n'interdit que l'on puisse mettre une classe singe et une classe arbre en relation dans une autre classe pour créer une classe zoo...

    Mais, sans savoir exactement la manière dont tu veux mettre les deux classes en relation, ni ce que font exactement les classes que tu veux mettre en relation ou l'objectif que tu suis en les mettant en relation, on ne peut que se contenter de présenter les différentes possibilité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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/10/2014, 10h25
  2. Réponses: 9
    Dernier message: 26/03/2009, 11h43
  3. Réponses: 3
    Dernier message: 06/02/2007, 15h13
  4. Inclusion de classes / problème de déclaration
    Par scal-80 dans le forum C++
    Réponses: 5
    Dernier message: 21/06/2006, 16h28
  5. Réponses: 4
    Dernier message: 13/07/2005, 14h56

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