Conteneur en C++

Signaler
Messages postés
3
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
25 novembre 2011
-
Messages postés
3
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
25 novembre 2011
-
Salut,

Je souhaite définir un catalogue modélisé comme un conteneur d’objets d’un type parent en C++.
Ce catalogue contient 3 familles d’appareils : un type téléphone mobile(GSM), un assistant numérique personnel (PDA)et un Smartphone (combinant appareil mobile et assistant personnel).
Certaines des méthodes doivent être communes à tous ces objets, au moins du point de vue de l’interface, et permettre des manipulations génériques au niveau du conteneur.

Pour la réalisation du problème, j’envisage définir une classe mère « Catalogue » ayant des attributs comme : type d’objet, sa marque, son identifiant de modèle, ses caractéristiques et son prix.
Les sous classes « gsm », « «pda » et « smartphones » pourront alors hériter de cette classe mère.
Je voudrais savoir si la sous classe « smartphones » doit hérité de « gsm » et «pda » (vu qu’elles combinent les deux fonctionnalités ?)
Comment peut-on structurer ce catalogue modélisé comme conteneur.

Merci :)

3 réponses

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
124
Tu peux tout à fait faire ce que tu as dit. Ça me semble correct.

Néanmoins, attention, dû à l'héritage multiple, ça ne fonctionnera techniquement pas sans virtualité.
En effet, si tu as une méthode ou un attribut dans ta classe mère, elle sera donc doublé puisque tu va en hériter deux fois.
(Pda et Gsm hérite de Device, Smartphone hérite de Pda et Gsm, donc Smartphone hérite deux fois de Device).
Ça va créer des ambiguïtés, puisque le compilateur ne saura pas lequel prendre.

Pour régler cela, il faut lui dire de ne pas doubler les classes mères identiques. Et c'est la qu'intervient un héritage peu connu: l'héritage virtuel.

Voici un exemple (Si tu retires virtual devant l'héritage, tu verras que ça ne compilera plus):
#include 
#include <list>

class Device
{
public:
  virtual std::string whoami() const = 0;
};

class Pda : virtual public Device
{
public:
  virtual std::string whoami() const
  {
    return "Pda";
  }
};

class Gsm : virtual public Device
{
public:
  virtual std::string whoami() const
  {
    return "Gsm";
  }
};

class Smartphone : virtual public Pda, virtual public Gsm
{
public:
  virtual std::string whoami() const
  {
    return "Smartphone";
  }
};

int main()
{
  typedef std::list<Device*>::const_iterator iter;
  std::list<Device*> tab;

  tab.push_back(new Pda);
  tab.push_back(new Gsm);
  tab.push_back(new Smartphone);

  for (iter it = tab.begin(); it != tab.end(); ++it)
    std::cout << (*it)->whoami() << std::endl;

  for (iter it = tab.begin(); it != tab.end(); ++it)
    delete *it;

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
9
Bonne idée l'héritage virtuel, par contre il me semble qu'il a juste le "2ème niveau" qui hérite virtuellement.

Je m'explique :

  
       ClasseA
      /       \
 ClasseB     ClasseC
      \       /
       ClasseD


ClasseB et ClasseC héritent virtuellement, donc
class ClasseB : virtual public ClasseA
{
//...


pareil pour ClasseC,

mais ClasseD a un héritage multiple normal :

class ClasseD : public ClasseB, public ClasseC
{
//...


autrement dit j'aurais tendance à remplacer :


class Smartphone : virtual public Pda, virtual public Gsm
{
public:
  virtual std::string whoami() const
  {
    return "Smartphone";
  }
};


par

class Smartphone : public Pda, public Gsm
{
public:
  virtual std::string whoami() const
  {
    return "Smartphone";
  }
};


voilà, sinon pour le reste je suis tout à fait d'accord.



C++dialement

Pop70
Messages postés
3
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
25 novembre 2011

@ CptPingu et Pop70 merci pour l intervention : ), je pensais être passé à coté de la plaque en terme d héritage multiple.
Actuellement je suis entrain d’implémenter ce catalogue(Device) en c++ en le modélisant comme un conteneur d objets d’un type parent correspondant à ces trois familles d’appareils.
J envisage créer des objets à chaque famille d appareils tout en associant quelques caractéristiques, à ce niveau je ne vois pas très bien comment procéder. J ai tout de même mit en place un fichier.h de la classe "Device" qui se présente comme suit :

#ifndef DEF_DEVICE
#define DEF_DEVICE

class Device
{

    public:

    void characteristicsGSM(int carrierFrequencies, int voiceCodecs, std::string networkStructure, std::string subcriberIdentityModule, std::string phoneLocking, std::string serviceSecurity  );
    void characteristicsPDA(std::string touchScreen, std::string memoryCards, std::string connectivity, std::string synchronization );
    void ascendyDeviceOrderByPrice(int price); //Tri du catalogue par prix croissant
    void searchDeviceByIDmodel(std::string IDmodel); // Recherche d'un appareil dont on connait le modèle


    private:

    std::string objetType;
    std::string mark;
    std::string IDmodel;
    int price;


};

#endif




Merci.