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 :

Héritage : comment faire la différence entre mes objets enfants


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut Héritage : comment faire la différence entre mes objets enfants
    Bonjour,

    J'ai trouvé un petit exercice, mais je ne sais pas comment faire sur un point.

    J'ai une classe Meuble qui hérite de ElementCuisine. Dans l'énoncé il est écrit qu'on peut ajouter une option à un meuble (une poignée ou un matériau par exemple). Dans le cas d'une poignée, on ajoutera son prix au prix du meuble. Dans le cas d'un matériau, on appliquera une majoration au prix du meuble.
    Donc j'ai fait un classe Option, et une classe Poignee qui hérite de Option. Dans ma classe Meuble, j'ai créer un vector d'Option* et une méthode d'ajout qui va avec.

    Avant d'aller plus loin, je me pose la question suivante : comment, dans ma Classe Meuble, lorsque je vais parcourir mon vector d'Option* pour calculer le prix du meuble, je vais réussir à faire la différence entre une Poignee et un Materiau ?

    Merci d'avance pour les pistes apportées !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Tu n'as pas à faire la différence. Tu dois simplement récupérer leur prix.

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Oui mais on calcule pas de la même facon si c’est l’option est une poignée ou matériau. Par exemple si mon meuble coûte de base 20€. J’ajoute une poignée à 10€, donc le prix du meuble devient 20+10. Si l’option est un materiau, elle va par exemple augmenter le prix du meuble de 10%, donc celui-ci deviendra 20+20*10%.

    On remarque bien que le calcul n’est pas le même selon le type de l’option, non ?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu peux avoir une seconde fonction qui indique si le prix est une majoration ou une pièce supplémentaire.

    Fais-le à la main, sans code
    Ta liste contient:
    1. une lampe à 15€
    2. un frigo à 100€
    3. un meuble à 30€ en bois (+20%)
    4. un meuble à 20€ avec poignée (+10€)


    la fonction prix() du meuble doit retourner le prix final (le prix de base modifié par l'option).
    L'option doit pouvoir calculer un prix modifié quand on lui donne un prix de base. prix_final(prix)J'imagine que auto meuble::prix() const { return has_option() ? option().prix(prix_base) : prix_base; } devrait faire l'affaire.

  5. #5
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    C'est exactement ce pour quoi est fait le mot-clé virtual et l'abstraction (et un autre terme qui m'échappe).
    Tu n'as pas à savoir que ton objet est un matériau ou une poignée, tu as besoin de savoir combien coûte l'option.
    Si tu veux garder une distinction entre eux, l'héritage n'a rien à faire et une collection homogène encore moins.
    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.

  6. #6
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Merci pour vos réponses.
    J'avais réussi avec une fonction dans option :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     virtual const double prix(double prix) const = 0;
    que je dérivais par exemple dans Materiau par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const double prix(double prix) const { prix*_majoration; }
    Ca marchait bien, enfin ça donnait le resultat espéré.
    Seulement je me suis rendu compte après, que si je mettais un meuble comme paramètre de la fonction prix dans Option, je pouvais accéder au prix du meuble justement.
    Ainsi ma fonction devient comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtual const double prix(const Meuble m) const = 0;
    Et dans Materiau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const double prix(const Meuble m) const { return m.getPrix()*_majoration; }
    Dans meuble pour calculer le prix final je fais ceci :
    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
     
    const double Meuble::prixFinal() const
    {
    	double somme = 0;// 
    	if (_lesOptions.size() >= 1)
    	{
    		for (int i(0); i < _lesOptions.size(); i++)
    		{
    			somme += _lesOptions[i]->prix(this);
    		}
    	}
    	else
    	{
    		somme = _prix;
    	}
    	return somme;
    }
    Seulement maintenant j'ai un nombre incalculable d'erreurs, je ne vois pas ce que je fais de mal pourtant ?

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pourquoi donner le meuble en argument, si tu ne veux que le prix?

    Si tu as plusieurs options, ma solution est mauvaise.
    Tu as des options s'ajoutant au prix, et d'autres qui le multiplient.
    Il te faut deux listes, sous peine d'avoir des erreurs.
    Ainsi, "un meuble, avec une poignée, fait en bois" couterait (10 + 10) * 1,2
    ce qui est différent d'"un meuble, fait en bois, avec une poignée" 10 * 1,2 + 10

Discussions similaires

  1. Petit problème dans un exercice
    Par med1001 dans le forum Débuter
    Réponses: 1
    Dernier message: 12/01/2015, 10h28
  2. Problème dans un exercice algorithmique
    Par abdou005 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 13/11/2011, 16h03
  3. Problème dans un exercice(recherche)
    Par sassa4 dans le forum Excel
    Réponses: 2
    Dernier message: 22/12/2007, 16h43
  4. [POO] Problème dans un exercice sur l'héritage
    Par FabaCoeur dans le forum C++
    Réponses: 2
    Dernier message: 05/05/2007, 17h09

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