Rechercher : dans
Par :

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

Dernière réponse le 10 jun 2008 à 09:14:11 Hobro, le 9 jun 2008 à 22:53:40 
 Signaler ce message aux modérateurs

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.

Configuration: Linux
Firefox 3.0

Meilleures réponses pour « [C++] Appel méthode propre à une classe fille » dans :
Le mot-clé static ou les attributs et méthodes de classe en POO Voir(NOTE: Cet article explique la signification du mot-clé static au sein d'une classe. La signification de "static" en C n'a par exemple rien à voir.) Vous êtes débutant en programmation orientée objet. En Java, en C++...ou que sais-je encore,...
Les fonctions en C++ : surcharge et paramètres par défaut. VoirLes fonctions en C++ : surcharge et paramètres par défaut. 1. La surcharge de fonctions et méthodes de classes, dont le constructeur 2. Utilisation des paramètres par défaut En C++, une même fonction ou méthode de classe peut être...
Introduction à la STL en C++ (standard template library) VoirIntroduction Principales classes de la STL std::pair std::list std::vector std::set std::map Les iterators iterator et const_iterator reverse_iterator et const_reverse_iterator Les algorithmes ...
PHP - Les classes VoirLa notion de classe Php3 intègre un soupçon de caractéristiques empruntées aux langages orientés objet, c'est-à-dire la possibilité d'utiliser des objets, entités regroupant des données et des fonctions au sein d'une structure et rendant la...
Les classes en langage C++ VoirLa notion d'objet Le langage C est un langage procédural, c'est-à-dire que c'est un langage permettant de définir des données grâce à des variables, et des traitements grâce aux fonctions. L'apport principal du langage C++ par rapport au...
Les objets en langage C++ VoirLa création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...

1

Hobro, le 9 jun 2008 à 22:57:11

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

Répondre à Hobro

2

 Char Snipeur, le 10 jun 2008 à 09:14:11

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. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur