Héritage....

Héritage.... - C++ - Programmation

Marsh Posté le 29-08-2005 à 20:00:27    

Bonsoir,  
 
Voilà, je découvre l'héritage en C++ et j'ai la situation suivante :
 
Une classe "AlgoGen"
Une classe "AlgoA" qui hérite de "AlgoGen"
Une classe "AlgoB" qui hérite de "AlgoGen"
 
Dans le fichier qui contient la méthode main, j'ai donc #include"AlgoA.h" et #include "AlgoB.h"
Dans les AlgoA.h et AlgoB.h j'ai donc #include"AlgoGen.h".
 
Or à la compilation il me dit : AlgoGen.h:11: error: redefinition of 'class AlgoGen' ce qui correspond à la ligne :
class Algorithme {
 
Vous m'avez compris ?  :pt1cable:  
Ma question : pourquoi cette erreur ? Si je supprime de main.cpp un des deux include "AlgoA.h" ou "AlgoB.h", alors ce marche.

Reply

Marsh Posté le 29-08-2005 à 20:00:27   

Reply

Marsh Posté le 29-08-2005 à 20:24:17    

as tu mis des include guards dans tes .h ??

Reply

Marsh Posté le 29-08-2005 à 22:41:11    

peux tu développer ? ... je viens de Java moi :)

Reply

Marsh Posté le 29-08-2005 à 22:45:37    

#ifndef ALGOA_H
#define ALGOA_H
 
/* Tout va la */
 
#endif

Reply

Marsh Posté le 30-08-2005 à 02:00:35    

c'est une blague ?

Reply

Marsh Posté le 30-08-2005 à 03:35:36    

Taz a écrit :

c'est une blague ?


 
je crois que oui


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 30-08-2005 à 17:02:25    

Bon juste pour éclairer ta lanterne Greeeg je vais expliciter un peu ce que t'on dis les autres.
si tu fais ce que tu as dis ton compilateur lorsque il compile le fichier principal qui contient le main se sert des includes pour trouver les fonctions/objets/méthodes... que tu utilise et qui ne sont pas défini sur place.
Pour se faire il va regarder à l'interieur de tes fichiers AlgoA.h et AlgoB.h et il fait pareil à l'interieur de ceux ci, si bien que quand il passe dans AlgoA.h il trouve #include AlgoGen.h et il va regarder ce qu'il y a dedans puis quand il passe dans AlgoB.h il retrouve #include AlgoGen.h il y retourne et donc il crois trouver une nouvelle définition de ce qu'il avait vu précedement... d'ou ton l'erreur qu'il te sort.
Comme te l'a indiqué Matafan pour te prémunir de cette erreur tu encadre le contenu de ton .h par :
   
#ifndef NOM_FICHIER_H
#define NOM_FICHIER_H
 
/*tes includes, Ton code...*/
 
#endif
 
comme ca le compilateur ne définira qu'une fois pour toute le contenu d'un .h même si il est inclus dans un million de fichiers  :)

Reply

Marsh Posté le 30-08-2005 à 17:07:26    

sharky01 a écrit :


#ifndef NOM_FICHIER_H
#define NOM_FICHIER_H
 
/*tes includes, Ton code...*/
 
#endif
 
comme ca le compilateur ne définira qu'une fois pour toute le contenu d'un .h même si il est inclus dans un million de fichiers  :)


tu sors toi ...

Reply

Marsh Posté le 30-08-2005 à 17:54:04    

Taz a écrit :

tu sors toi ...


 
tu peux expliquer Taz??
 
Moi j'aurais juste mis les prototypes des fonctions dans le fichier, pas le code...  

Reply

Marsh Posté le 30-08-2005 à 18:41:41    

t'as une idée du nombre impressionant de gens qui ont un fichier stack.h ? et du nombre d'idiots qui ont encadrés ça par un STACK_H ?
 
H_TAZHFR_STACK_1125420015
 
ça c'est solide !

Reply

Marsh Posté le 30-08-2005 à 18:41:41   

Reply

Marsh Posté le 30-08-2005 à 19:00:48    

Oui heureusement tu n'es pas obligé de mettre le nom de ton fichier avec les directive #ifndef ... tu mets ce que tu veux on s'en fout. Là j'ai mis ca pour l'exemple j'aurais put mettre directement ALGOA_H comme Matafan ou TOTO_H. Et par code je me suis mal exprimé je voulais bien evidement parler des protos, definitions d'objets ... Bref ce que l'on mets généralement dans un .h  

Reply

Marsh Posté le 30-08-2005 à 19:01:32    

Taz a écrit :

t'as une idée du nombre impressionant de gens qui ont un fichier stack.h ? et du nombre d'idiots qui ont encadrés ça par un STACK_H ?
 
H_TAZHFR_STACK_1125420015
 
ça c'est solide !


Tout ca pour ca :pfff:

Reply

Marsh Posté le 30-08-2005 à 19:19:45    

ça le vaut. Faut vraiment pas y voir plus loin que le bout de son nez pour écrire des
 
#define STACK_H
#define N 100
 
...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed