[C++] Appel méthode propre à une classe fille

Fermé
Hobro - 9 juin 2008 à 22:53
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 10 juin 2008 à 09:14
Bonjour,

Je dois faire un projet en C++ et je dois programmer un monopoly.

Je vous mets tout d'abord une partie du code, et je mettrai les explications de mon problème après.

Voici le code en partie, avec juste 2 classes filles :

----------------------------CLASSE MERE cases-----------------------

class cases
{
protected :
string nom;
int pos;
int prix;
int loyer;
string proprietaire;

public :
cases(string _nom, int _pos, string indice_case);
virtual int get_loyer()=0;
virtual int get_prix()=0;
virtual string get_nom()=0;
virtual string get_proprietaire()=0;
virtual void proprio(string _proprio);
};

cases::cases(string _nom, int _pos, string indice_case)
{
nom=_nom;
pos=_pos;
proprietaire="aucun";

if(indice_case=="Gare")
prix=2500;
if(indice_case=="Propriete")
prix=_pos*1000;
if(indice_case=="Compagnie")
prix=2500;
if(indice_case=="Autre")
prix=0;

if(indice_case=="Gare")
loyer=500;
if(indice_case=="Propriete")
loyer=_pos*100;
if(indice_case=="Autre")
loyer=0;
if(indice_case=="Compagnie")
loyer=0;
}

void cases::proprio(string _proprio)
{
proprietaire=_proprio;
}

-------------------CLASSE FILLE cDepart-----------------------

class cDepart : public cases
{
private :
int gain_dessus;
int gain_passage;

public :
cDepart() : cases("Depart",0,"Autre"), gain_dessus(40000), gain_passage(20000) {};
int get_gaindessus();
int get_gainpassage();
int get_loyer();
int get_prix();
string get_nom();
string get_proprietaire();
void proprio(string _proprio);
};

int cDepart::get_gaindessus(){return gain_dessus;}

int cDepart::get_gainpassage(){return gain_passage;}

int cDepart::get_loyer(){return loyer;}

int cDepart::get_prix(){return prix;}

string cDepart::get_nom(){return nom;}

string cDepart::get_proprietaire(){return proprietaire;}

void cDepart::proprio(string _proprio){cases::proprio(_proprio);}


---------------------------CLASSE FILLE cCompagnie----------------------------------

class cCompagnie : public cases
{
public :
cCompagnie(int _pos) : cases("Compagnie",_pos,"Compagnie") {};
void set_loyer(int lancer_de);
int get_loyer();
int get_prix();
string get_nom();
string get_proprietaire();
void proprio(string _proprio);
};

void cCompagnie::set_loyer(int lancer_de)
{
loyer=lancer_de*200;
}

int cCompagnie::get_loyer(){return loyer;}

int cCompagnie::get_prix(){return prix;}

string cCompagnie::get_nom(){return nom;}

string cCompagnie::get_proprietaire(){return proprietaire;}

void cCompagnie::proprio(string _proprio){cases::proprio(_proprio);}


--------------------MAIN---------------------------

cases* test[40];
test[0]=new cDepart;
test[1]=new cCompagnie;
....
....

cout<<test[0]->get_nom()<<endl; //Affiche bien le nom de la case, ici Depart
cout<<test[1]->get_prix()<<endl; //Affiche bien le prix de la case, ici 2500
cout<<test[0]->get_gaindessus()<<endl; //Lors de la compilation, me met que la méthode n'est pas dans la classe "cases"


Je suis débutant, je comprends tout à fait que je ne puisse pas appeler cette méthode, car elle n'est pas déclarée dans la classe mère, contrairement aux autres qui sont bien définies comme virtuelles dans la classe mère, Mais cette dernière méthode est spécifique à la classe fille cDepart, et donc je n'ai pas envie de devoir la taper dans chaque autre classe fille, dans le cas où je la declarerai virtuelle dans la classe mère.
Je recherche donc une solution pour pouvoir appeler cette méthode get_gaindessus avec ce type de déclaration pour mes cases.

J'ai essayer avec dynamic_cast, en mettant :
test[0]=dynamic_cast<cDepart>(test[0])
mais lors de l'éxécution il me met une erreur de segmentation dès que j'arrive à la première ligne d'affichage, si je l'enleve, il m'affiche bien la nouvelle première, mais erreur de segmentation quand il arrive à la suivante.

J'ai aussi essayé les pointeurs sur les membres d'une classe, et j'ai taper un truc du genre :
typedef int (cDepart::* gain)(void);
gain gain_dessus=&cDepart::get_gaindessus;

et ensuite pour l'affichage :
cout<<table[0]->*gain_dessus<<endl;
et j'ai l'erreur : pointer to member type «int (cDepart::)()» incompatible with object type «cases»

Enfin voilà, dites moi ce que je peux faire pour résoudre mon problème, qui est de pouvoir appeler une méthode propre à une classe fille, qui n'est donc pas dans les autres classes filles, donc ni dans la classe mère.
Si mes solutions sont bonnes mais mal écrite, dites le moi aussi.
Enfin pour résumer, j'ai besoin de votre aide.

Merci d'avance pour l'aide apportée.

2 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 juin 2008 à 09:14
test[0]=dynamic_cast<cDepart>(test[0]) ;
ça c'est moche. Et ça ne sert à rien, car test[0] est de type cases* dont tu transforme ton test[0] en cDepart* puis en case* pour l'affectation par '='.
je ne connait pas les dynamic_cast, mais ceci devrai fonctionner :
cout<<((cDepart*)test[0])->get_gaindessus();
ta méthode ne fesant pas partie de la classe mère, il est évidant que tu ne puisse pas l'appeler directement.
En revanche, tu as bien réservé la bonne quantité de mémoire, donc il ne devrais pas y avoir de souci de mémoire.
2
Pour info, j'avais déjà posté ce problème, mais j'ai préféré refaire un post parce que j'ai changé quelques trucs dans mon code, j'ai essayer des choses, et puis j'ai voulu reformuler mon problème.

Je mets tout de même le lien de l'autre post :
http://www.commentcamarche.net/forum/affich 6781813 probleme methode propre a une classe fille#0
0