freepouy18
Messages postés49Date d'inscriptionmercredi 20 avril 2005StatutMembreDernière intervention15 septembre 2005
-
10 juin 2005 à 15:43
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 2006
-
13 juin 2005 à 17:25
Bonjour,
Voila, j'ai un souci avec l'utilisation de méthodes virtuelles pures lors de leurs redéfinition dans une sous-classe. voici le code ainsi qu'une petite explication:
=========CLASSE MERE===========
class A
{
public:
struct MaStruct
{
char* ch1;
char* ch2;
};
A(); //constructeur
virtual ~A(); //destructeur
virtual MaStruct* get_info() =0; //méthode virtuelle pure non définie dans le .cpp
};
==============================================
=========CLASSE FILLE=========================
class B
{
public:
struct MaStruct
{
char* ch1;
char* ch2;
};
B(); //constructeur
virtual ~B(); //destructeur
MaStruct* get_info(); //je veux ici renvoyer un tableau de structure
};
==============================================
Erreur générée: error C2555: 'B::get_info' : overriding virtual function differs from 'A::get_info' only by return type or calling convention D:\....\ClasseMere.h : see declaration of 'A'
En fait je veux ici redéfinir ma méthode virtuelle pure mais apparement il y a un problème avec la STRUCTURE MaStruct que je désire renvoyer puisque avec une méthode simple (ex: virtual int mafonction() =0) j'arrive a la redéfinir en codant (int mafonction();)dans la classe fille.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 10 juin 2005 à 16:11
Tes structures ont la même apparence, mais pour le compilo elles sont
bien différentes. Tu dois définir ce type une seule fois, dans un .h
que tu inclus dans les 2 classes
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 10 juin 2005 à 18:56
Et oui dans un cas c'est A::MaStruct et l'autre B::MaStruct et donc c'est pas pareil.
La structure doit être déclarée une seule, fois par contre tu peux la laisser dans la classe A si elle public ou protected (class B pourra ainsi y accéder par héritage).
freepouy18
Messages postés49Date d'inscriptionmercredi 20 avril 2005StatutMembreDernière intervention15 septembre 2005 13 juin 2005 à 14:50
Oui, je sais bien mais le problème c'est que lorsque j'enlève la déclaration de la structure dans la classe B (fille), j'ai une erreur lorsque j'essaye d'utiliser une fonction qui renvoie cette meme structure.
#include <fich_classA.h>
class B
{
public:
B(); //constructeur
virtual ~B(); //destructeur
MaStruct* get_info(); //erreur à ce niveau
};
Sinon j'avais déjà essayer de mettre mes structures dans un autre ".h" mais le problème est toujours le même, je n'arrive pas à déclarer de fonction retournant une de ces structures sans qu'une erreur ne survienne.
Est-ce que je ne dois pas déclarer la structure que je souhaite retourner dans la classe concernée (celle qui contient la méthode qui devrait retourner cette structure)? Ce serai un truc dans ce genre :
virtual MaStruct* get_info() =0; //méthode virtuelle pure non définie dans le .cpp et qui doit retourner ma fameuse structure ERREUR
};
==============================================
freepouy18
Messages postés49Date d'inscriptionmercredi 20 avril 2005StatutMembreDernière intervention15 septembre 2005 13 juin 2005 à 14:54
Je voulais aussi présiser que j'ai bien fait le #include "Structure.h" mais aussi que j'avais la même erreur que je déclare un autre ".h" contenant les structures ou que je les déclares dans la classe mère.
Vous n’avez pas trouvé la réponse que vous recherchez ?
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 13 juin 2005 à 17:01
Et en mettant
virtual A::MaStruct* get_info(); (sans le = 0 qui a mon avis ne doit pas être là sinon tu as encore une classe virtuelle pure non instanciable)
Je ne comprend pas nonplus pourquoi l'application a besoin de ce "=0" mais en tous cas avec, ça fonctionne.
Tu sais, à force d'essayer mille et une façon de régler le problème on est même obligé d'essayer des choses que le compilateur fini par accépter.
Mais je suis bien d'accord avec toi, le "=0" est selon moi attribué aux méthodes virtuelles pures. Mais bon je ne saurais pas dire pourquoi ça marche ainsi...
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 13 juin 2005 à 17:25
Cette erreur te dis qu'il manque le code de la fonction c'est pour ça que ça marche avec le =0.
Il faut mettre dans un .cpp :
A::MaStruct* B::get_info()
{
return NULL;
}