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 :

Encore un soucis de constructeur


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut Encore un soucis de constructeur
    Bonjour.

    J'essaie de faire cet exercicehttps://erlerobotics.gitbooks.io/erl...cises_oop.html dont la solution est donnée :

    Write a program that defines a shape class with a constructor that gives value to width and height. The define two sub-classes triangle and rectangle, that calculate the area of the shape area (). In the main, define two variables a triangle and a rectangle and then call the area() function in this two varibles.
    La solution proposée :
    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
    // Exercises: OOP#include <iostream>
    // Exercise 1
     
    using namespace std;
     
    class Shape
    {
    protected:
    	float width, height;
    public:
    	void set_data (float a, float b)
    	{
    		width = a;
    		height = b;
    	}
    };
     
    class Rectangle: public Shape
    {
    public:
    	float area ()
    	{
    		return (width * height);
    	}
    };
     
    class Triangle: public Shape
    {
    public:
    	float area ()
    	{
    		return (width * height / 2);
    	}
    };
     
    int main (){
     
    	Rectangle rect;
    	Triangle tri;
    	rect.set_data (5,3);
    	tri.set_data (2,5);
    	cout << rect.area() << endl;
    	cout << tri.area() << endl;
    	return 0;
    }
    J'étais personnellement parti avec l'idée d'utiliser un constructeur au lieu d'utiliser une fonction "void set_data (float a, float b)" , comme ci-dessous :
    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
    #include <iostream>
    using namespace std;
     
    class Shape {        // The class
    protected:
    int hauteur;
    int largeur;
      public:          // Access specifier
     
        Shape(int x, int y) {  // Constructor with parameters
          hauteur = x;
          largeur = y;
        }
    };
    class Rectangle : public Shape {
    public:
     
    float area (){
    return (hauteur * largeur);
    }
    };
     
     class Triangle : public Shape {
     public:
     
    float area() {
    return (hauteur * largeur/2.0);
    };
     };
     
    int main() {
      Rectangle r(10, 99);
      Triangle t(3, 5);
     
     
      // Print values
      cout << "Aire du rectangle : " <<r.area() << "\n";
      cout << "Aire du triangle : " << t.area() << "\n";
      return 0;
    }
    Or, ça ne fonctionne pas et je ne vois pas comment corriger l'erreur ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Les constructeurs ne sont pas propagés aux classes filles.
    Pour les exposer identiques, il y a la syntaxe using BaseClassName::BaseClassName;.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Pour construire une Shape, il faut lui fournir 2 arguments.

    Les Rectangle et Triangle sont des Shape. Mais tu n'indiques pas comment les construire. Ton idée est surement que ça soit comme une Shape. Pour cela tu dois définir les constructeurs ou dire que c'est comme Shape.
    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
    class Shape
    {
    public:
    	Shape( double width, double height ) : width_{width}, height_{height} {}  // fabriquer les membres au plus tôt
            virtual  area()const = 0;                 // indiquer que toutes les Forme ont une aire et que la lire ne modifie aucune Forme
            double  width()const { return  width_; }   // lire la largeur, ne modifie pas la Forme
            void  width( double w ) { width_ = w ; }
            double  height()const { return  height_; } // pour écrire/lire la hauteur
            void  height( double h ) { height_ = h; }
    private:                              // Ne jamais définir d'attribut protected, c'est public ou private
    	double  width_, height_;      // éviter d'utiliser le type float, double est à préférer sauf rares exceptions
    };
    class Rectangle : public Shape
    {
    public:
    	using Shape::Shape;     // Rectangle se construit en utilisant directement les constructeurs de Shape
    	double  area ()const override {
    		return  width() * height();
    	}
    };
    // ou
    class Triangle : public Shape
    {
    public:
    	Triangle( double width, double height ) : Shape{width, height} {}
    	double  area()const override {
    		return  width() * height() / 2;
    	}
    };

  4. #4
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juin 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Juin 2014
    Messages : 219
    Par défaut
    Merci pour ces réponses.

    @dalfab
    A la ligne 4 :
    Shape( double width, double height ) : width_{width}, height_{height} {} // fabriquer les membres au plus tôt
    Je ne comprend pas cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     : width_{width}, height_{height}
    D'autre part, je ne comprend pas ce que fait ce constructeur, il n'y a rien dans le corps de la fonction ??

  5. #5
    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
    Par défaut
    Il initialise la donnée membre width_ à l'aide de l'argument width passé au constructeur, idem pour heigth. Du coup (et comme c'est très souvent le cas), il ne reste plus rien à faire dans le corps du constructeur, tout est déjà initialisé comme il faut.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Ça s'appelle la liste d'initialisation https://cpp.developpez.com/faq/cpp/?...-l-affectation
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Encore un souci de syntaxe
    Par santacrus dans le forum VBA Access
    Réponses: 9
    Dernier message: 09/09/2008, 06h47
  2. Encore un soucis de dérivation de ostream
    Par Bolverk dans le forum SL & STL
    Réponses: 2
    Dernier message: 21/08/2008, 15h03
  3. Encore un souci avec l'arrière-plan Word !
    Par spyto dans le forum Word
    Réponses: 5
    Dernier message: 28/05/2008, 15h24
  4. Encore un soucis avec IServerProvider
    Par r0d dans le forum C++/CLI
    Réponses: 3
    Dernier message: 18/01/2007, 22h28
  5. Encore un souci : Treeview
    Par hunzi dans le forum XMLRAD
    Réponses: 1
    Dernier message: 16/09/2006, 18h12

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