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 :

Visibilité de methodes dans Classe de Class


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut Visibilité de methodes dans Classe de Class
    Je cherche a rendre visible une methode virtualle f de la classe englobante. Voici un exemple de code qui bien sûr ne marche pas:

    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
    class A{
    public:
    	A(){}
    	~A(){}
     
    	static int a;
    	inline virtual int f()=0;
    private:
    	class B{
    		public:
    			B(){}
    			~B(){}
    			inline virtual int g()=0;
    			inline int h(){ return g();}
    		};
    	};
     
    class AA:A{
    public:
    	AA(){}
    	~AA(){}
    	inline int f(){return a++;}
    private:
    	class BB:B{
    		public:
    			BB(){}
    			~BB(){}
     
    			AA  tmp;
    			inline  int g(){ return tmp.f();}
    		};
    	};
    on notera que private ne joue pas dans les messages d erreur.
    Le message d erreur est qu il ne voit pas la classe englobante ( AA tmp

    Si vous avez des questions n hesitez pas.

    Merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    pour preciser le message d erreur

    error C2079: 'tmp' uses undefined class 'ConstantCreditIntensity'

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    Correction
    pour preciser le message d erreur

    error C2079: 'tmp' uses undefined class 'AA'

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Dans ta déinition de la classe AA, tu utilise une classe BB qui contiens elle-même un membre de type AA. Tant que tu n'as pas fini de définir AA, le compilo ne sais pas ce qu'est AA.

    Tu peux essayer de déclarer l'existance de la classe AA avant la définition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class AA;
    class AA{
    ...
    };
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    J ai essaye mais ca n a pas marche. cependant j ai elimine cette erreur en faisant AA* tmp;

    voici le nouveau code corrigé:


    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
    class A{ 
    public: 
       A(){} 
       ~A(){} 
     
       static int a; 
       inline virtual int f()=0; 
    public: 
       class B{ 
          public: 
             B(){} 
             ~B(){} 
             inline virtual int g()=0; 
             inline int h(){ return g();} 
          }; 
       }; 
     
    class A::B;
     
    class AA:A{ 
    public: 
       AA(){} 
       ~AA(){} 
       inline int f(){return a++;} 
    public: 
       class BB:B{ 
          public: 
             BB(){} 
             ~BB(){} 
     
             AA  *tmp; 
             inline  int g(){ return tmp->f();} 
          }; 
       };

    Il reste les dernieres erreurs et pas des moindre:

    error C2259: 'B' : cannot instantiate abstract class due to following members:

    error C2504: 'B' : base class undefined (dans l heritage BB:B )


    Aidez moi je vous en supplie

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    Je ne sais pas si c'est la solution, mais j'ai une petite idée.

    En fait, tu déclares que ta classe BB hérite de la classe B. Or, la classe B n'a pas d'existence en tant que tel.

    Essaies ceci :


  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    en effet ca permet de voir la class B comme dependant directement de A. Voici le nouveau code :

    voici le nouveau code corrigé:

    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
    class A{ 
    public: 
       A(){} 
       ~A(){} 
     
       static int a; 
       inline virtual int f()=0; 
    public: 
       class B{ 
          public: 
             B(){} 
             ~B(){} 
             inline virtual int g()=0; 
             inline int h(){ return g();} 
          }; 
       }; 
     
     
    class AA:A{ 
    public: 
       AA(){} 
       ~AA(){} 
       inline int f(){return a++;} 
    public: 
       class BB:A::B{ 
          public: 
             BB(){} 
             ~BB(){} 
     
             AA  *tmp; 
             inline  int g(){ return tmp->f();} 
          }; 
       };
    Il reste neanmoins l erreur error C2259:
    'B' : cannot instantiate abstract class due to following members:

    le debugger restant coince sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             inline int h(){ return g();}

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    en effet ca permet de voir la class B comme dependant directement de A. Voici le nouveau code :

    voici le nouveau code corrigé:

    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
    class A{ 
    public: 
       A(){} 
       ~A(){} 
     
       static int a; 
       inline virtual int f()=0; 
    public: 
       class B{ 
          public: 
             B(){} 
             ~B(){} 
             inline virtual int g()=0; 
             inline int h(){ return g();} 
          }; 
       }; 
     
     
    class AA:A{ 
    public: 
       AA(){} 
       ~AA(){} 
       inline int f(){return a++;} 
    public: 
       class BB:A::B{ 
          public: 
             BB(){} 
             ~BB(){} 
     
             AA  *tmp; 
             inline  int g(){ return tmp->f();} 
          }; 
       };
    Il reste neanmoins l erreur error C2259:
    'B' : cannot instantiate abstract class due to following members:

    le debugger restant coince sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             inline int h(){ return g();}

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    non ca marche

    Je vous remercie

  10. #10
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    salut,
    Citation Envoyé par Math75
    Le message d erreur est qu il ne voit pas la classe englobante ( AA tmp
    en C++ il est impossible de créer un objet qui contient un objet de même type, cela conduirait à une recursivité sans fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A
    {
      public:
        //...
      private:
        A a;
    };
    Cela est impossible, un objet de class A contiendrait un autre objet de class A qui contiendrait un autre objet de class A qui.....

    Par contre le code suivant est correct (est même très souvent utilisé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A
    {
      public:
        //...
      private:
        A* a;
    };

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

Discussions similaires

  1. [AS2]Visibilité de variable dans une class
    Par ViveLesQuads dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 06/12/2007, 16h47
  2. Réponses: 11
    Dernier message: 05/10/2006, 13h20
  3. Réponses: 2
    Dernier message: 02/05/2006, 14h34
  4. methode pour exécuter une class dans un jar
    Par yann_p dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2006, 17h47
  5. [Language]utilisation de méthodes dans différentes classes
    Par The Wretched dans le forum Langage
    Réponses: 4
    Dernier message: 09/05/2005, 16h17

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