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 :

Classe imbriquée


Sujet :

C++

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut Classe imbriquée
    Bonsoir ,

    J' ai un petit problème.
    Le code n' est pas trop important je le livre :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <iostream>
     
    using namespace std;
     
    template < typename T >
    class AA
    { private:
      protected :
     
      class BB 
      { public :
        T val ;
        BB() {}
        BB( T v ) : val(v) {}
      };
     
      BB * B ;
      public:
      AA()  { B= 0; }
      AA( const T& v ) 
      { B = new BB( v ) ; }
     
     ~AA() { delete B ; }  
     
      void show()
      {  cout << B->val << endl ; }
     
      BB * getIn();
     
      void run() 
      { BB * b = getIn() ;
        cout << b->val << endl ;
      }  
    };
     
    template < typename T >
    AA<T>::BB * AA<T>::getIn() 
    { return B ; }
     
    void do1()
    { AA<int>  a(999) ; 
      a.show() ;
      a.run() ;
    }
     
    int main( int argc, char ** argv )
    { do1() ;
      return 0 ;
    }
    Ca tourne , mais ça tourne mal puisque à la compliation j' obtiens des warnings du genre "implicite typename is deprecated".

    C' est la méthode BB * getIn() qui pose problème.

    Si vous avez une idée, ce serait sympa ?

    Cordialement.

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    personnellement je n'ai aucun warning avec VC6.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Le nom BB dépend du paramètre template. Pour certaines valeurs de ce paramètre, tu opourrais avoir spécialisé le template pour définir BB autrement. Il se pourrait alors que ce nouveau BB soit un nom de variable, et non un nom de type.

    Le compilateur ne peut donc pas savoir la nature de BB. Par défaut, il est sensé supposer qu'il s'agit d'une variable. Tu peux lui dire que c'est un type, en utilisant typename.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template < typename T >
    typename AA<T>::BB * AA<T>::getIn()
    { return B ; }
    Le compilo VC6 se plantait sur cette règle du langage, ça a été corrigé depuis. D'où l'utilisation du terme deprecated (ils aiment bien ce terme récemment chez visual C++), et le fait que ce soit juste un warning pour raison de compatibilités.

  4. #4
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Sous Mingwin, c'est même pas un warning...
    C'est une erreur->pas de compilation possible!
    Comment ça se fait que chez vous ça passe et pas sur mon compilo?
    Avez-vous touché aux réglages du compilo?
    A+

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 49
    Points : 43
    Points
    43
    Par défaut
    Salut
    J'ai lu qlq part que VC (du mois VC.NET) refuserait de compiler les definitions des fonctions membre d'une classe imbrique a mois que celles-ci soit a l'interieur de la declarion de cette classe.
    a+

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonsoir,

    J' ai essayé un nouveau code, pour éviter les "warning" et le blocage avec d' autres compilateurs.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <iostream>
     
    using namespace std;
     
    template < typename T >
    class AA
    { private:
      protected :
     
      class BB 
      { public :
        T val ;
        BB() {}
        BB( T v ) : val(v) {}
      };
     
      BB * B ;
      public:
      AA()  { B= 0; }
      AA( const T& v ) 
      { B = new BB( v ) ; }
     
     ~AA() { delete B ; }  
     
      void show()
      {  cout << B->val << endl ; }
     
      void * getIn();
     
      void run() 
      { BB * b = (BB*) getIn() ;
        cout << b->val << endl ;
      }  
    };
     
    template < typename T >
    void * AA<T>::getIn() 
    { return (void*) B ; }
     
    void do1()
    { AA<int>  a(999) ; 
      a.show() ;
      a.run() ;
    }
     
    int main( int argc, char ** argv )
    { do1() ;
      return 0 ;
    }
    On dirait que ça tourne avec tous les compilateurs. Pour y parvenir je me suis servi d' un pointer générique que j' ai ensuite transtypé (casting). Ce n' est pas élégant dans la doctrine du C++, mais si vous proposez une autre solution, je l' accepte volontiers.

    Cordialement.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    As tu essayé mon code en ajoutant typename ? Faisait-il encore des warnings ? Où et lesquels ?

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonsoir,

    Cher JolyLoic ,

    J' ai testé votre proposition, ça tourne nickel. Mais la syntaxe est un peu lourde. Ma proposition de faire recours à des pointeurs génériques est plus simple, mais ne correspond pas aux puristes du c++.

    J' aurai donc le choix.
    Merçi pour votre aide.

    Cordialement.

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    et... quel est l'interet des classes imbriques?
    j'ai lu qqpart qu'il vaut mieux deriver...

  10. #10
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par Float*
    et... quel est l'interet des classes imbriques?
    j'ai lu qqpart qu'il vaut mieux deriver...
    héritage / composition

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    héritage / composition
    mmm c'est peu parlant, tu peux etre un peu plus explicite :

Discussions similaires

  1. [C#]Remonter des événements dans des classes imbriquées
    Par Kcirtap dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/12/2013, 13h43
  2. Réponses: 6
    Dernier message: 28/12/2006, 19h22
  3. Classe imbriquée et son constructeur
    Par toninlg dans le forum C++
    Réponses: 7
    Dernier message: 30/09/2006, 07h21
  4. classes imbriquées
    Par smedini dans le forum C++
    Réponses: 10
    Dernier message: 10/12/2005, 14h16
  5. Intérêt des classes imbriquées ?
    Par elitost dans le forum Langage
    Réponses: 5
    Dernier message: 21/10/2005, 10h30

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