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

Langage C++ Discussion :

Definition d'une classe dans une structure


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Definition d'une classe dans une structure
    Bonjour!

    Est-il possible de definir une structure a l'interieur de la definition d'une classe?

    Dans le cas ou ce n'est pas possible, peut-on definir une structure dans le meme fichier .h que la classe?

    Merci d'avance!!

  2. #2
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par circe Voir le message
    Est-il possible de definir une structure a l'interieur de la definition d'une classe?
    Oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class toto
    {
       struct titi { int nombre; }
    };
    Cela définit la structure titi dans la classe toto

    Citation Envoyé par circe Voir le message
    Dans le cas ou ce n'est pas possible, peut-on definir une structure dans le meme fichier .h que la classe?
    Oui, la notion 1 classe, 1 fichier est une habitude mais pas une contrainte. Tu fais ce que tu veux.

  3. #3
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci pour la reponse rapide!!

    Et si j'insere un typedef a l'interieur de la classe toto, est-ce que l'ordinateur va le considerer comme une instance de la classe?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class toto
    {
       typedef vector< double > titi;
    };
    Merci pour l'aide!!

  4. #4
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Oui, dans ce cas, titi est un nouveau type de type "vector de doubles" connu uniquemlent dans la classe toto.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Le vocabulaire est un peu confus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class toto
    {
       typedef vector< double > titi;
    };
    titi n'est pas une instance de la classe toto mais un type de la classe toto. Une instance, c'est pour un objet.
    titi n'est pas un 'nouveau' type mais un synonyme sur vector<double> :
    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
    #include <vector>
    struct toto
    {
       typedef std::vector<double> titi;
    };
     
    int main()
    {
       toto::titi v;
       std::vector<double> v2;
       v = v2; // OK
     
       std::vector<int> v3; // c'est un nouveau type
       v = v3; // erreur
        return 0;
    }

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

    Informations professionnelles :
    Activité : aucun

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

    Oui, il est possible de définir n'importe quel type défini par l'utilisateur (c'est valable pour les structures, mais aussi pour les classes, les unions, les énumérations et les alias de type) à l'intérieur d'une classe.

    Il est d'ailleurs possible de le faire non seulement dans une classe, mais aussi dans une structure, ou une union.

    Le terme "officiel" de cette pratique est "classe imbriquée" (respectivement structure/union/énmération/alias de type).

    En anglais, on parle de "nested class" (respectivement structure,...)

    Et, oui, on peut définir cette classe (respectivement structure/union/énumération/alias de type) dans le même fichier d'en-tête.

    C'est d'ailleurs conseillé dans le sens où... la définition de la classe se trouve très souvent directement... à l'intérieur de la classe dans laquelle elle est imbriquée.

    Il faut également noter que la connaissance de la classe imbriquée dépendra de la visibilité dans laquelle elle (la classe imbriquée) est définie:

    La classe imbriquée ne sera utilisable que par la classe dans laquelle elle est imbriquée si elle (la classe imbriquée) est soumise à une accessibilité private:, accessible à la classe dans laquelle elle est imbriquée et aux classe dont la classe dans laquelle elle est imbriquée si elle est soumise à une accessibilité protected: et accessible depuis "n'importe où" sous la forme de classe_imbriquante::classe_imbriquee si elle est soumise à une accessibilité public:
    Ainsi tu auras souvent un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
        /* private: / protected: / public: */
        class subA
        {
            /* définition de subA */
        };
        /* reste de la définition de A */
    };
    Il est possible de "sortir" la définition de la classe imbriquée de celle dans laquelle elle est imbriquée, afin d'en cacher (si on le juge nécessaire) l'implémentation.

    Nous nous contenterons alors de la seule déclaration de la classe imbriquée dans le fichier d'en-tête et nous placerons la définition dans le fichier *.cpp.

    Cela imposera cependant certaines restrictions:
    • Seule l'utilisation de pointeurs et/ou de références vers cette classe sera autorisée dans le fichier d'en-tête ou dans les fichiers qui l'incluent de manière directe ou indirecte.
    • Seul le fichier dans lequel la fonction imbriquée est effectivement définie sera en mesure de travailler réellement avec elle
    Nous pouvons en arrivons donc à un code proche de
    fichier A.h
    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
    class A
    {
        /* private: / protected : / public : */
        class subA;
        void foo(subA & ); //OK, c'est une référence
        void bar(subA * ); //OK, c'est un pointeur
       /* void fun(subA ) ; KO : subA n'est pas défini */
        subA & op(); // uniquement si subA est soumise à public:
        subA * op2(); // uniquement si subA est soumise à public:
        private:
            subA * ptr; // OK
            subA & ref; // OK
            subA val; // KO
    };
    void freefunction(A::subA &); //uniquement si subA est soumise à public:
    fichier A.cpp
    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
    #include <a.h>
    class A::SubA
    {
        /* définition de subA */
    };
    A::A():ptr(new subA)
    {
    };
     
    void A::foo(subA & sub)
    {
        sub.doSomething();
    }
    void A::bar(subA * ptr)
    {
       ptr->doSomething();
    }
     
    A::subA & A::op()
    {
        return *ptr;
    }
    A::subA * a::op2()
    {
       return ptr;
    }
    void freefunction(A::subA & sub)
    {
       sub.doSomething()
    }
    fichier onefile.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <a.h>
    A truc;
    A::subA * ptr=truc.op2(); //ok, c'est un pointeur
    A::subA & ref = truc.op(); //ok, c'est une référence
    freefunction(*ptr); // ok
    freefunction(ref); // ok
     
    /* KO... subA non défini  
    A::subA var;
    ref.doSomethin;();
    ptr->doSomething();
    */

  7. #7
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci pour les reponses... En incluant ma structure a l'interieur de la classe, j'ai le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _matrix
        {
            double values[5][6];
        } matrix;
     
    typedef vector< matrix > ListMatrix;
    Tout est en private et a l'interieur du fichier .h de ma classe 'Leaf'. Mais j'obtient le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: `typedef class std::vector<Leaf::_matrix, std::allocator<Leaf::_matrix> > Leaf::ListMatrix' is private
    D'ou vient cette erreur vu que je ne manipule que des objets a l'interieur d'une classe?

    Merci encore!

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    PAS DE TYPEDEF SUR LES DEFINITIONS DE TYPE EN C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct matrix
        {
            double values[5][6];
        };
     
    typedef vector< matrix > ListMatrix;
    Ensuite, il faudrait que tu nous montre la ligne de code qui provoque l'erreur

Discussions similaires

  1. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  2. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  3. [POO] Une Classe dans une Classe. C'est possible?
    Par FrankOVD dans le forum Langage
    Réponses: 2
    Dernier message: 18/05/2006, 22h02
  4. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34
  5. Une classe dans une classe...
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2005, 19h36

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