[C++] Appel méthode propre à une classe fille
Hobro
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
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.
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.
A voir également:
- [C++] Appel méthode propre à une classe fille
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Appel privé - Guide
- Double appel - Guide
- La zone de données passée à un appel système est insuffisante - Windows 11
- Désactiver remise en main propre leboncoin - Forum Vos droits sur internet
2 réponses
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.
ç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.
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
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