cs_HerveYims
Messages postés3Date d'inscriptionlundi 18 mai 2009StatutMembreDernière intervention25 novembre 2011
-
11 févr. 2011 à 12:00
cs_HerveYims
Messages postés3Date d'inscriptionlundi 18 mai 2009StatutMembreDernière intervention25 novembre 2011
-
12 févr. 2011 à 16:14
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.
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 11 févr. 2011 à 14:32
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/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
cs_HerveYims
Messages postés3Date d'inscriptionlundi 18 mai 2009StatutMembreDernière intervention25 novembre 2011 12 févr. 2011 à 16:14
@ 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