Classe liste chaînée générique [Résolu]

Signaler
Messages postés
115
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
11 mai 2009
-
Messages postés
115
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
11 mai 2009
-
Salut à tous,



Je souhaite gérer un parc de véhicules contenant des motos et
des voitures. Pour se faire, j'ai donc implémenter trois classes : une
classe ParcVehicule, une classe Voiture et une classe Moto.

La classe ParcVehicule est une classe générique qui gère les listes chaînées, il s'agit en l’occurrence d'une classe modèle.

Par contre, mon problème est le suivant :



Comment déclaré un objet de type ParcVehicule
utilisable à la fois pour un objet de type Voiture et un objet de type
Moto ?



En effet, je suis contraint de déclarer deux objets différents pour la classe ParcVehicule de la manière suivante :



ParcVehicule<Voiture> *ParcVoiture = new ParcVehicule<Voiture>

ParcVehicule<Moto> *ParcMoto = new ParcVehicule<Moto>



Si vous avez des pistes, ça serait sympa de m'en faire part.



Merci d'avance.



Marik7335

3 réponses

Messages postés
43
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007

Salut !



Je pense qu'il te serais utile d'utiliser l'héritage de classe : tu définis une classe de base, en l'occurence ParcVehicule
,
qui contient toutes les fonctions nécessaires communes aux deux types
de véhicules (en l'occurence les listes chaînées, dans lesquelles tu
utilises uniquement des pointeurs ParcVehicule*
) :



class ParcVehicule

{

//déclarations des membres de la classes.

}




puis, tu définis les classes dérivées selon le schema



class nom_classe_dérivée : class nom_classe_base

{

//fonctions membres

}




ie dans ton cas



class Moto : class ParcVehicule

{


//fonctions membres

}




class Voiture : class ParcVehicule

{


//fonctions membres

}



L'avantage avec les classes dérivées, c'est qu'un pointeurs de la
classe de base peut recevoir un pointeur vers n'importe laquelle de ses
classes dérivées, en l'occurence,

ParcVehicule* pvehicule;

peut recevoir aussi bien un pointeur de classe Moto que de classe
Voiture. Tu peux ainsi utiliser une seule et même liste chaînée pour
stoquer tes Motos ou tes Voitures. Pour pouvoir distinguer les motos
des voitures, il te suffit de d'ajouter un membre à la classe de base
se référant au type, par exemple une entier, qui sera initialisé avec
la bonne valeur dans chacun des constructeurs des classes dérivées.



Je pourrais encore en dire tès long sur l'héritage de classes, tant les
possibilités qu'il offre sont nombreuses (en vrac, surdéfinition de
fonctions ou d'opérateurs, polymorphisme, ou dans ton cas, ajout de
nouveaux types de véhicule en limitant la quantité de réécriture du
code, etc.)



Je te conseille vivement de lire des docs sur l'héritage de classe (malheureusement, je n'en ai pas à te proposer )



bonne nuit

-- Virtual Dust --
Messages postés
18
Date d'inscription
samedi 6 novembre 2004
Statut
Membre
Dernière intervention
12 mars 2005

Salut, je suis tout à fait d'accords avec ce qui à été dit plus haut
j'aurais également opté pour la même solution. Par contre pour ce qui
concerne les héritages de classes j'ai quelque chose à te proposer,
j'avais fait un tout petit tutoriel sur la manière d'implémenter les
mécanismes d'héritage en C++ qui se trouve sur cppfrance:
http://www.cppfrance.com/code.aspx?id=27917

Si tu veux que je te donne un coup de main pour t'expliquer comment on
peut implémenter une solution pour ton problème il ne devrait pas y
avoir de soucis.

Amuse toi bien

darkkinj
http://www.kinj.fr.st
Messages postés
115
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
11 mai 2009

Je te remerci pour ton aide darkkinj mais je crois avoir trouvé la solution :

J'ai tout simplement creé une classe Vehicule, puis les classes Motos
et Voiture qui sont des classes dérivées de la classe Vehicule.

Je déclare ensuite un objet dynamiquement de type Vehicule de la manière suivante :



Vehicule *Vehi = NULL;



Pour créer une voiture, je fais simplement :



Vehi = new Voiture;



et pour une moto :



Vehi = new Moto;



Puis la méthode ajouter de la classe ParcVehicule s'occupe d'ajouter un
véhicule, qui est soit une voiture ou soit une moto, dans ma liste tout
simplement en l'implémentant de la manière suivante :



ParcVehicule::Ajouter(Vehicule *Vehi);



Je te remerci encore une fois pour ton aide darkkinj. Et merci à toi vdust pour m'avoir mis sur la piste. J'avais pas du tout pensé à l'héritage.



Marik7335