Partage
  • Partager sur Facebook
  • Partager sur Twitter

instance d'un objet

d'une classe A OU d'une classe B

Sujet résolu
Anonyme
    19 septembre 2007 à 15:41:55

    Bonjour,

    Après quelques recherches sur Google et les forums SdZ, je me décide à poser ma question...

    Je voudrais instancier un objet à partir d'une classe A ou d'une classe B (qui hérite de A) :

    1. class A
    2. {
    3. protected:
    4.         int var1;
    5. public:
    6.         A(int val);
    7.         int methode() const;
    8. };
    9. class B : public A
    10. {
    11. protected:
    12.         int var2;
    13. public:
    14.         B(int val);
    15.         int methode() const;
    16. };
    17. A::A(int val) : var1(val)
    18. {
    19. }
    20. int A::methode() const
    21. {
    22.         return 2 * var1;
    23. }
    24. B::B(int val) : A(val), var2(3)
    25. {
    26. }
    27. int B::methode() const
    28. {
    29.         return var2 * var1;
    30. }


    1. /* main.cpp */
    2. if(true)
    3.         {
    4.                 A objet(10);
    5.         }
    6.         else
    7.         {
    8.                 B objet(10);
    9.         }
    10.         objet.methode();
    11.         return EXIT_SUCCESS;


    Mais quand je compile, le compilateur renvoie l'erreur suivante :

    Citation

    objet, identificateur non déclaré



    Je voudrais donc savoir comment faire.

    Merci...
    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2007 à 15:46:31

      parce que objet existe dans un bloc : entre "{" et "}"

      alors après ton if... il n'existe plus
      • Partager sur Facebook
      • Partager sur Twitter
        19 septembre 2007 à 15:47:32

        fait ceci :
        1. if(true)
        2. {
        3.     A objet(10);
        4.     objet.methode();
        5. }
        6. else
        7. {
        8.     B objet(10);
        9.     objet.methode();
        10. }


        edit : ou passe par un pointeur
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          19 septembre 2007 à 15:54:13

          Et il n'y a pas un autre moyen ?
          • Partager sur Facebook
          • Partager sur Twitter
            19 septembre 2007 à 15:58:58

            Citation : Orionis

            Et il n'y a pas un autre moyen ?


            à quel autre moyen penses-tu ?
            • Partager sur Facebook
            • Partager sur Twitter
              19 septembre 2007 à 18:23:17

              L'autre solution est de déclarer un pointeur avant le if puis créer une instance de la classe correspondante dans le if.

              P.S.: Ne pas oublier le delete après le new.
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              Anonyme
                19 septembre 2007 à 18:45:09

                Oui mais je dois spécifier le type du pointeur, or je ne sais pas encore si c'est A ou si c'est B.
                • Partager sur Facebook
                • Partager sur Twitter
                  19 septembre 2007 à 18:53:42

                  tu le fais du type A vu que B hérite de A en oubliant pas de mettre "virtual" devant la méthode "methode".
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    19 septembre 2007 à 19:08:55

                    Merci de votre aide, ça marche maintenant...


                    Voici donc le code final (pour ceux qui rencontreraient le même problème) :

                    1. class A
                    2. {
                    3. protected:
                    4.         int var1;
                    5. public:
                    6.         A(int val);
                    7.         virtual int methode() const; // Méthode qui sera réécrite dans B
                    8. };
                    9. class B : public A
                    10. {
                    11. protected:
                    12.         int var2;
                    13. public:
                    14.         B(int val);
                    15.         int methode() const;
                    16. };
                    17. A::A(int val) : var1(val)
                    18. {
                    19. }
                    20. int A::methode() const
                    21. {
                    22.         return 2 * var1;
                    23. }
                    24. B::B(int val) : A(val), var2(3)
                    25. {
                    26. }
                    27. int B::methode() const
                    28. {
                    29.         return var2 * var1;
                    30. }


                    1. /* Main.cpp */
                    2. int main()
                    3. {
                    4.         A *objet = NULL;
                    5.         if(false)
                    6.         {
                    7.                 objet = new A(5);
                    8.         }
                    9.         else
                    10.         {
                    11.                 objet = new B(10);
                    12.         }
                    13.         objet->methode();
                    14.         delete objet;
                    15.         return EXIT_SUCCESS;
                    16. }


                    Edit : Heuuu, en fait j'ai encore un problème xD...

                    Si je définis une méthode dans la class B qui n'est pas présente dans la class A, la compilation échoue puis cette méthode n'est pas dans A, comment je peux faire ?

                    1. class A
                    2. {
                    3. protected:
                    4.         int var1;
                    5. public:
                    6.         A(int val);
                    7.         virtual int methode() const; // Il faut dire au compilo qe cette méthode risque d'être réécrite
                    8. };
                    9. class B : public A
                    10. {
                    11. protected:
                    12.         int var2;
                    13. public:
                    14.         B(int val);
                    15.         int methode() const;
                    16.         bool autre();
                    17. };
                    18. A::A(int val) : var1(val)
                    19. {
                    20. }
                    21. int A::methode() const
                    22. {
                    23.         return 2 * var1;
                    24. }
                    25. B::B(int val) : A(val), var2(3)
                    26. {
                    27. }
                    28. int B::methode() const
                    29. {
                    30.         return var2 * var1;
                    31. }
                    32. bool B::autre()
                    33. {
                    34.         return true;
                    35. }


                    1. int main()
                    2. {
                    3.         A *objet = NULL;
                    4.         if(false)
                    5.         {
                    6.                 objet = new A(5);
                    7.         }
                    8.         else
                    9.         {
                    10.                 objet = new B(10);
                    11.         }
                    12.         objet->methode();
                    13.         if(true)
                    14.         {
                    15.                 objet->autre();
                    16.         }
                    17.         delete objet;
                    18.         return EXIT_SUCCESS;
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 septembre 2007 à 19:37:14

                      tu ne peux utiliser une methode unique à B si ton pointeur pointe sur un objet de type A! logique

                      Pour évité à devoir casté ton objet il s'agit d'avoir une bonne conception du programme
                      • Partager sur Facebook
                      • Partager sur Twitter

                      instance d'un objet

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown