Probleme de fonctions vurtuelles

Résolu
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006 - 5 mars 2006 à 01:46
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006 - 5 mars 2006 à 03:38
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

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 mars 2006 à 03:30
tu a bien remplace tout les "&Maillon()" par "new Maillon()" ?
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 mars 2006 à 01:58
essaye ca :

class FormGeo
{
public:

FormGeo();
~FormGeo();
virtual Display()=0;
};
0
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 02:16
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
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 mars 2006 à 02:24
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 02:32
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.
0
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 02:41
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:
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 mars 2006 à 02:45
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...
0
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 03:01
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...
0
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 03:10
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...
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 mars 2006 à 03:13
ta essaye de mettre
Maillon *root= new Maillon();
a la place de
Maillon *root=&Maillon();
?
0
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 03:17
ca change rien
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 mars 2006 à 03:18
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 !
0
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 03:30
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.
0
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 03:32
j'ai rien dit il y avait encore une déclaration sans new...
Merci beaucoup!!!
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
5 mars 2006 à 03:35
ca a resolu ton pb d'appel de fonction virtuelle?

si oui eske tu peu valider la reponse stp
0
troukatruc Messages postés 11 Date d'inscription mercredi 15 novembre 2000 Statut Membre Dernière intervention 5 mars 2006
5 mars 2006 à 03:38
oui ca l'a resolu en meme temps :p merci :)
0
Rejoignez-nous