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 :

inherance répartir dans les fichiers


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Décembre 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2020
    Messages : 21
    Par défaut inherance répartir dans les fichiers
    Bonjour a tous,

    j'ai trouver là https://www.tutorialspoint.com/cplus...nheritance.htm un exemple qui fonctionne dans un fichier cpp comment faire avec les quatre fichier suivant Rectangle.h Rectangle.cpp Shape.h Shape.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
    /*
     * E.h
     *
     *  Created on: 6 mars 2021
     *      Author: vincent
     */
     
    #ifndef RECTANGLE_H_
    #define RECTANGLE_H_
    #include "Shape.h"
     
    class Rectangle: public Shape {
    public:
    	Rectangle();
    	virtual ~Rectangle();
    };
    #endif /* RECTANGLE_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
    16
    17
    18
    19
    /*
     * E.cpp
     *
     *  Created on: 6 mars 2021
     *      Author: vincent
     */
     
    #include "Rectangle.h"
     
    #include <iostream>
    using namespace std;
     
    // Derived class
    class Rectangle: public Shape {
       public:
          int getArea() {
             return (width * height);
          }
    };
    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
     
    /*
     * E.cpp
     *
     *  Created on: 6 mars 2021
     *      Author: vincent
     */
     
    #include "Rectangle.h"
     
    #include <iostream>
    using namespace std;
     
    // Derived class
    class Rectangle: public Shape {
       public:
          int getArea() {
             return (width * height);
          }
    };

    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
     
    /*
     * B.h
     *
     *  Created on: 6 mars 2021
     *      Author: vincent
     */
     
    #ifndef SHAPE_H_
    #define SHAPE_H_
     
    class Shape {
    public:
    	Shape();
    	virtual ~Shape();
    };
     
    #endif /* SHAPE_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
    16
    17
    18
     
    #include <iostream>
    #include "Shape.h"
    #include "Rectangle.h"
     
    using namespace std;
     
    int main(void) {
       Rectangle Rect;
     
       Rect.setWidth(5);
       Rect.setHeight(7);
     
       // Print the area of the object.
       cout << "Total area: " << Rect.getArea() << endl;
     
       return 0;
    }

  2. #2
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 636
    Par défaut De long en large
    Bonjour,

    Il y a deux fois le même code (implémentation - très partielle - de Rectangle)

    D'où viendrait width et height puisqu'ils n'apparaissent ni dans Shape ni dans Rectangle ?

    De même les setWidth() et setHeight() sont définis où ?

    Cela semble plus du près à faire que du près à améliorer (l'exemple original ne souffre pas de ces défauts).

    Salutations

  3. #3
    Membre actif
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Décembre 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2020
    Messages : 21
    Par défaut Merci beaucoup d'avoir répondu !
    Bonjour ,
    oui, je suis d'accord. tu as le lien qui fonctionne avec cpp unique et je me demande comment les ".h" sont construit. Personnellement c'est ma difficulté de construire les .h a partir des exemple cpp. dans le livre "c primer" c'est la même chose je bute sur cette question comment déclarer la classe qui va avec le code cpp. Bienvenue a ceux qui montre au moins une fois

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 636
    Par défaut Héritage et rage
    Bonjour,

    Il y a un exemple qui marche, il ne faut pas supprimer des éléments au hasard.

    Je propose une approche différente : reprendre le code d'origine et créer deux objets nouveaux.
    • Une ellipse qui hérite de Shape
    • Un carré qui hérite de Rectangle

    En s'inspirant de Rectangle qui hérite de Shape ce ne devrait pas être très difficile.

    Il faut ensuite peupler les méthodes de création (pour le carré) et de surface (pour l'ellipse).

    Une remarque, il faut éviter de renommer intempestivement les fichiers. Apparemment Shape.h serait devenu B.h (commentaires d'en-tête) mais les autres fichier cherchent toujours à inclure Shape.h !

    Bonne continuation

  5. #5
    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,

    Ce qui doit être mis dans un fichier d'entête, c'est ce que les autres fichiers doivent connaître à minima pour accéder aux choses que tu définis dans ton code cpp.
    • Pour les variables et objets, le minimum est une déclaration de la variable ou de l'objet. Mais comme les variables et objets globaux c'est mal, on ne doit que très rarement voir cela.
    • Pour les fonctions et les opérateurs libres, le minimum est la déclaration de la fonction ou de l'opérateur. La déclaration est aussi appelée prototype dans ce cas. Il y a le type de retour et les types de tous les paramètres.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      double carre( double );
    • Pour les enum, il faut mettre la définition (la déclaration suffit depuis le C++17 mais c'est particulier.)
    • Pour les classes et les unions, il faut en mettre la définition, et celle-ci doit être unique et pas en plusieurs morceaux comme tu as essayé de faire. Ça inclut tous les membres de la classe, donc les types inclus, les alias inclus, les variables inclues et les fonctions inclues y compris les constructeurs et destructeurs. Pour ces fonctions un simple prototype suffit, le corps peut-être défini dans le fichier cpp.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      class Rectangle: public Shape {
      public:
      	Rectangle();                // prototype suffit, le corps défini ailleurs
      	~Rectangle()overide = default;   // corps du destructeur est ici automatique
      	int  getPerimeter()const;   // le prototype est le minimum.
      	int  getArea()const {        // cas particulier, on peut mettre le corps, la fonction est ici 'inline'
      		return  width * height; 
      	}
      };
    • On doit ajouter au début et à la fin un moyen d'éviter la réentrance de l'entête. Et on doit mettre les includes nécessaires à l'entête, l'entête doit utiliser les entêtes dont il a lui-même besoin ni plus ni moins.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      #ifndef RECTANGLE_H_
      #define RECTANGLE_H_
      #include "Shape.h"  // rectangle a besoin de connaître Shape
       
      ...
       
      #endif /* RECTANGLE_H_ */
    Et on doit mettre dans le cpp tout ce qui n'est pas là.

    Il y a d'autres cas (les templates, les fonctions et les variables inline, les alias de types, les concepts, ...) mais je pense que ça devrait t'aider.

  6. #6
    Membre actif
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Décembre 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2020
    Messages : 21
    Par défaut Merci beaucoup d'avoir répondu !
    merci pour ta réponse très complète aurais tu un conseil de lecture

  7. #7
    Membre actif
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Décembre 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2020
    Messages : 21
    Par défaut j'ai modifié comme suis mais j'obtiens une redéfinition
    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
    /*
     * B.h
     *
     *  Created on: 6 mars 2021
     *      Author: vincent
     */
     
    #ifndef SHAPE_H_
    #define SHAPE_H_
     
    class Shape {
    public:
    	Shape();
    	virtual ~Shape();
    	void setWidth(int w);
    	void setHeight(int h);
    };
     
    #endif /* SHAPE_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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /*
     * B.cpp
     *
     *  Created on: 6 mars 2021
     *      Author: vincent
     */
     
    #include "Shape.h"
    #include <iostream>
     
    using namespace std;
     
    // Base class
    class Shape {
       public:
          void setWidth(int w) {
             width = w;
          }
          void setHeight(int h) {
             height = h;
          }
     
       protected:
          int width;
          int height;
    };
    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
     /*
     * E.h
     *
     *  Created on: 6 mars 2021
     *      Author: vincent
     */
     
    #ifndef RECTANGLE_H_
    #define RECTANGLE_H_
    #include "Shape.h"
     
    class Rectangle : public Shape {
    public:
    	Rectangle();
    	virtual ~Rectangle();
    	void getArea(int width, int height) const;
    };
    #endif /* RECTANGLE_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
    16
    17
    18
    19
    *
     * E.cpp
     *
     *  Created on: 6 mars 2021
     *      Author: vincent
     */
     
    #include "Rectangle.h"
     
    #include <iostream>
    using namespace std;
     
    // Derived class
    class Rectangle : public Shape {
       public:
          int getArea(int width, int height)  {
             return (width * height);
          }
    };

    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
    #include <iostream>
    #include "Shape.h"
    #include "Rectangle.h"
     
    using namespace std;
     
    int main(void) {
       Rectangle Rect;
     
       Rect.setWidth(5);
       Rect.setHeight(7);
     
       // Print the area of the object.
       cout << "Total area: " << Rect.getArea() << endl;
     
       return 0;
    }
    ce qui me parais normal vue que j'ai deux fois le même code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Rectangle : public Shape {
    dans le .h et le .cpp mais comment faire alors ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2009, 17h49
  2. ne pas ecrire dans les fichier log
    Par HULK dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/04/2006, 08h22
  3. Réponses: 8
    Dernier message: 18/07/2005, 14h04
  4. Réponses: 3
    Dernier message: 29/12/2004, 17h10

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