Probleme Polymorphisme/Erreur de segmentation

Résolu/Fermé
hobro - 7 juin 2008 à 12:37
 hobro - 7 juin 2008 à 14:44
Bonjour,

Je suis en train de faire un monopoly en c++, mais là j'ai un problème d'erreur de segmentation que je n'arrive pas à résoudre.
Je suis débutant donc je sais pas si j'arriverai à l'expliquer clairement.

Je vais tout d'abord mettre une partie de mon code :

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

public :
cases(string _nom, int _pos, string indice_case);
string get_nom();
virtual int get_prix();
virtual int get_loyer();
};

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;
}

class cPropriete : public cases
{
public :
cPropriete(int _pos) : cases("Propriete",_pos,"Propriete") {};
int get_loyer();
int get_prix();
};

class Plateau
{
public :
cases* table[2];
Plateau();
};

Plateau::Plateau()
{
table[1]=new cPropriete(25);
table[2]=new cPropriete(13);
}

Voila plusieurs scénario d'affichage :

int main()
{
Plateau test2;
cout<<test2.table[1]->get_prix()<<endl; //Affiche le loyer au lieu de prix
puts("ok"); //Affiche "ok" puis suivi d'erreur de segmentation, fin de l'éxécution
cout<<test2.table[1]->get_loyer()<<endl;
}

int main()
{
Plateau test2;
cout<<test2.table[1]->get_prix()<<endl; //Affiche le loyer au lieu de prix, puis suivi d'erreur de segmentation, FIN
}

int main()
{
Plateau test2;
cout<<test2.table[1]->get_loyer()<<endl; //Erreur de segmentation directe, FIN
puts("ok");
cout<<test2.table[1]->get_prix()<<endl;
}

Les méthodes get_loyer et get_prix retourne juste la valeur de loyer et de prix.
Voilà, si vous pouvez m'aider, merci d'avance, et puis au passge, pouvez vous me dire si ce code est bien structuré ou tout autre remarque qui pourrai me servir.

Merci encore.

1 réponse

Je viens de découvrir que si je supprime une des méthodes virtuelles déclarées dans la classe cases, et que j'appelle la non supprimer dans le main, et bien ca marche très bien.
Mais dès que je mets les deux dans un certain ordre dans la classe cases, et que je les appelle dans le même ordre dans le main, la premiere méthode est appelé et affiche ce qu'on attend, mais après, erreur de segmentation. Par contre si dans le main j'appelle les fonctions dans l'autre ordre, j'ai directement une erreur de segmentation. Il me suffit d'inverser les delclarations des méthodes virtuelles dans la classes cases afin d'avoir le même ordre dans me main et la classe cases, et j'ai donc l'affichage de la premiere methode suivi d'une erreur de segmentation.

Je me dis donc que le probleme viens de mes déclaration de méthodes virtuelles, mais je vois pas du tout comment y remédier.

Merci d'avance pour l'aide apporter.
0