Probleme de fonctions vurtuelles

[Résolu]
Signaler
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006
-
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006
-
Bonjour,
Voici mon problème:
j'ai une classe FormGeo et une classe Cercle qui hérite de ForGeo.

[code]
class FormGeo
{
public:

FormGeo();
~FormGeo();
virtual Display();
};

class Cercle : public FormGeo
{
protected:
char *nom;
float rayon;
Point2d centre;
public:
Cercle();
Cercle(Point2d,float);
float Getrayon();
Point2d Getcentre();
Translater(Point2d);
Setrayon(float);
Setcentre(Point2d);
Display();
};
[\code]

ensuite je crée un tableau de FormGeo pour y instancié des cercle.
[code]
FormGeo *list_form=new FormGeo[BUFFER_SIZE];
[\code]

ensuite j'ajoute donc mes cercle
[code]
tmp_cercle=Cercle(tmp_p,tmp_rayon);
list_geo[pos+1]=tmp_cercle;

[\code]

Cependant si aprés j'utilise ma fonction Display()
list_geo[pos+1].Display();
il utilise la fonction display de FormGeo et non pas de Cercle

Voila j'espere que qqn pourra me repondre rapidement merci!!!

16 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
tu a bien remplace tout les "&Maillon()" par "new Maillon()" ?
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
essaye ca :

class FormGeo
{
public:

FormGeo();
~FormGeo();
virtual Display()=0;
};
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

Et bien j'avais deja essayer comme ca mais lorsque je compile j'ai l'eereur suivante :

C:\Documents and Settings\Administrateur\Mes documents\projet\test\test.cpp(12) : error C2259: 'FormGeo' : cannot instantiate abstract class due to following members:
C:\Documents and Settings\Administrateur\Mes documents\projet\test\test.cpp(12) : warning C4259: 'int __thiscall FormGeo::Display(void)' : pure virtual function was not defined
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
tu a pas oublie de mettre un "void" devant ta fonction display (dans FormGeo et Cercle)?
et elle est bien redeclarée dans ta classe Cercle
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

non je n'avais pas mis void devant les fonction mais de toute facon ca change rien.
et oui elle est bien declarer dans la classe cercle.
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

Sinon en faite j'ai un autre probleme.
Au debut j'étais parti non pas avec un tableau de FomGeo mais avec une liste chainé.

donc je créé un nouveau maillon qui contient l'adresse d'une formgeo. je crée ma FormGeo jajoute son adresse etc..
donc tout ca dans une méthode d'une autre classe. mais quand je revien dans le cpp principal la formgeo que j'ai créé n'existe plus.
Et je ne vois pas ou est le probleme:
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
tu as bien declare ta formgeo en pointeur? paske sinon c normal qu'elle disparaisse.
Sinon c peut etre un probleme de chainage ou de pointeur. si tu modifie un pointeur, il faut bien modifier l'adresse du pointeur et pas le pointeur lui meme.

fais voire les fonctions et les appels qui correspondent...
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

voila les classe:

class Maillon
{
protected:
Maillon *pt_grp_suiv;
Maillon *pt_grp_prec;
Maillon *pt_suiv;
Maillon *pt_prec;
FormGeo *pt_figure;

public:

Maillon();
Maillon(FormGeo*);
Add_fig(FormGeo*);
Add_suiv(Maillon*);
Add_prec(Maillon*);
Add_Grp_suiv(Maillon*);
Add_Grp_prec(Maillon*);
Maillon* Get_pt_suiv();
Maillon* Get_pt_prec();
Maillon* Get_pt_Grp_suiv();
Maillon* Get_pt_Grp_prec();

Maillon* Get_last();
Maillon* Get_Grp_last();

FormGeo* Get_figure();
Display(Maillon *);
DisplayGrp();

};

class Console
{
protected:
int taille;
char** commande;

public:
Console();
Diplay();
AjoutCommande(char*);
ExecCommande(Maillon *);

int Commande_creer(Maillon*);

Commande_supp();
};

ensuite la fonction:
int Console::Commande_creer(Maillon* mon_maillon)
{
int choix=0;
bool test=false;
//Maillon* tmp_maillon=&Maillon();
Maillon* tmp_maillon=mon_maillon;
char* tmp_nom;
char* tmp_abs;
char* tmp_ord;
float tmp_rayon;
Cercle tmp_cercle;
Point2d tmp_p=Point2d();
unsigned int i,j;

(j'ai virer le traitement de la commande)

if(tmp_maillon->Get_pt_suiv()!=NULL)
{
tmp_maillon=tmp_maillon->Get_last();
}
tmp_maillon->Add_suiv(&Maillon());
tmp_maillon=tmp_maillon->Get_pt_suiv();
tmp_cercle=Cercle(tmp_p, tmp_rayon);
tmp_maillon->Add_fig(&tmp_cercle);
tmp_maillon->Get_figure()->SetName(commande[2]);
break;
case 2:
break;
default:
break;
}
return(0);
}

et enfin le cpp principal

int BUFFER_SIZE=1024;
char *commande=new char[BUFFER_SIZE];
Console cons=Console();
Maillon *root=&Maillon();

while(strcmp(commande,"quit")!=0)
{
delete[] commande;
commande=new char[BUFFER_SIZE];
cout<<"Entre ta commande:";
cin.getline(commande, BUFFER_SIZE, '\n');
if(strcmp(commande,"\n")!=0)
{
cons.AjoutCommande(commande);
cons.ExecCommande(root);

}
}
return 0;
}

Et donc le probleme c'est que juste apres l'execution du cons.execcommande j'arrive a recupéré et afficher la figure que je vien de créé cependant kan je retourne au debut du while la figure n'existe plus.
le pointeur pointe toujours a la meme adresse mais si je veu afficher des info, j'ai une erreur memoire ..
donc pourquoi ma figure n'est plus la...
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

je rectifie une chose en faite aprés la fonction execcommande l'adresse du suivant est bien la bonne mais la figure n'existe plus.
surement un probleme de porté de variable mais je ne vois pas comme contourner le probleme...
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
ta essaye de mettre
Maillon *root= new Maillon();
a la place de
Maillon *root=&Maillon();
?
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

ca change rien
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
ouais je pense que c'est bien ca. dans ta fonction commade_cree par exemple, tu as
tmp_maillon->Add_suiv(&Maillon());
et le fait de faire ca, ca equivaut à
Maillon xxxx();
tmp_maillon->Add_suiv(&xxxx);
or xxxx sera libere de la memoire a la fin de ta fonction.
utilise des new pour creer des instances, c fait pour ca !
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

ok merci ca a résolu une partie du probleme..
maintenant j'arrive a afficher juste aprés le execcommande.
mais pas aprés...quand je revien dans le while.
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

j'ai rien dit il y avait encore une déclaration sans new...
Merci beaucoup!!!
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
ca a resolu ton pb d'appel de fonction virtuelle?

si oui eske tu peu valider la reponse stp
Messages postés
11
Date d'inscription
mercredi 15 novembre 2000
Statut
Membre
Dernière intervention
5 mars 2006

oui ca l'a resolu en meme temps :p merci :)