Self dérivation de classe

Résolu
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008 - 8 janv. 2008 à 19:51
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008 - 9 janv. 2008 à 10:40
Bonjour, j'ai une idée qui m'a illuminé cette nuit mais je ne sais pas comment la réaliser, ni même si elle est possible.

J'ai une classe Vehicule avec des fonctions définies en virtual (tourner, avancer ...) et une fonction acheter(int nombrederoues);

Je crée aussi 2 autres classes : Moto ou Voiture où je définie mes fonctions (tourner avancer ...) spécifiquement sachant qu'elles utilisent des variable private de leur propre classe (volant dans Voiture ou guidon dans Moto par exemple).

Ce que j'aimerais faire, c'est acheter un vehicule en précisant juste le nombre de roues, et pouvoir le conduire sans me soucier de son type.

En code mon objectif est :

Vehicule transport;
transport.acheter(2);     //acheter une moto
transport.avancer();
transport.tourner();      //tourner le guidon

Donc je voudrais que mon transport puisse se dériver lui-même dans la fonction acheter() vers la classe Moto ou Voiture.
Je ne sais malheureusement pas comment m'y prendre, car je ne pense pas qu'un cast ou reinterpret cast puisse fonctionner depuis l'objet lui même.

Si ceci peut se faire ou si quelqu'un à une piste ...

Merci beaucoup

http://www.rc-bot.com/bannieres/banniere468x60.jpg

3 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
8 janv. 2008 à 23:30
Pas bien compris...
Tu veux simplement créer un véhicule avec un certain nombre de roues et ensuite le manipuler de façon transparente? Tu peux faire ça par exemple :

class Vehicule
{
public:
static Vehicule* acheter(int nb_roues);
virtual void tourner(void){...};
};

class Auto : public Vehicule
{
public :
virtual void tourner(void){...};
};

class Moto : public Vehicule
{
public :
virtual void tourner(void){...};
};

Vehicule* Vehicule::acheter(int nb_roues)
{
if(nb_roues==2) return new Moto;
else if(nb_roues==4) return new Auto;
else return 0;
}

et finalement :

int main(void)
{
Vehicule* Transport=Vehicule::acheter(2);
Transport->tourner();
return;
}

évidemment ce genre de choses ne fonctionne qu'à la  création de l'objet, tu ne peux plus transformer un objet en un autre par la suite.
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
8 janv. 2008 à 23:33
Oui ce que je veux dire c'est par rapport à ta syntaxe :
Vehicule transport;
transport.acheter(2);     //acheter une moto

tu peux pas transformer le vehicule en moto, c'est pour ca que j'ai mis une methode static qui te renvoie un nouvel objet (ca revient à peu près au même, non?)
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
9 janv. 2008 à 10:40
ça ressemble bien à ce que je veux faire. Mais j'attachais quand même une importance particulière à mon :
Vehicule transport;
transport.acheter(2);     //acheter une moto

Car en fait mon application est plus complexe que l'exemple que j'ai posté. Pour rester dans les vehicules, mon application retourne une liste de tous les vehicules disponibles lors de l'appel du constructeur de Vehicule. Et seulement après je voulais acheter mon véhicule, donc je voulais bien transformer, après sa création, un véhicule en moto.

Je comprends que ce n'est pas possible, mais ta solution conviendra à mon problème, je vais juste séparer la récupération de la liste de véhicules et l'achat de celui-ci.

Je te remercie

http://www.rc-bot.com/bannieres/banniere468x60.jpg
0
Rejoignez-nous