Bonjour,
Récemment, j'ai un problème d'héritage en C++ qui est un peu exotique je trouve.
classefille.cpp:4: erreur : class 'ClasseFile' does not have any field named 'm_attribut'
m_attribut (attribut)
^
J'ai une classe ClasseMere qui possède un attribut, une référence d'un objet. La classe ClasseFille en hérite, mais ne semble pas posséder elle aussi cet attribut, alors qu'il est bel et bien en protected.
Enfin bref, je poste le code source ici :
classemere.h
#ifndef CLASSEMERE_H
#define CLASSEMERE_H
#include "autreclasse.h"
class ClasseMere
{
public:
ClasseMere();
virtual void func () = 0;
protected:
AutreClasse &m_attribut;
};
#endif // CLASSEMERE_H
classemere.cpp
#include "classemere.h"
ClasseMere::ClasseMere ()
{
}
classefille.h
#ifndef CLASSEFILLE_H
#define CLASSEFILLE_H
#include <iostream>
#include "classemere.h"
class ClasseFille : public ClasseMere
{
public:
ClasseFille (AutreClasse &attribut);
virtual void func ();
protected:
void AutreFonction ();
};
#endif // CLASSEFILLE_H
classefille.cpp
#include "classefille.h"
ClasseFille::ClasseFille(AutreClasse& attribut) :
m_attribut (attribut)
{
}
void ClasseFille::func()
{
//
}
void ClasseFille::AutreFonction()
{
//
}
Si je comprends bien l'erreur que m'affiche QtCreator, le constructeur bogue parce que ClasseFille n'a pas l'attribut m_attribut. Mais ClasseFille hérite de ClasseMere. J'ai déjà essayé de passer m_attribut en public, mais sans succès.
Quelqu'un voit-il où se trouve mon erreur ?
# ClasseMere est inutilisable.
Posté par Batchyx . Évalué à 10. Dernière modification le 11 août 2013 à 12:10.
En C++, les références sont immuables et doivent donc être obligatoirement initialisées. Vu que ton constructeur n'initialise rien, il est invalide. Ta classe ne peut donc pas être construite, donc elle est inutilisable.
Vu que les héritiers ont aussi besoin de construire la classe de base, les héritiers sont inutilisables aussi.
Non, l'erreur c'est que
ClasseFille
n'a pas de champm_attribut
. Un champ et un attribut (on parle plutôt de membre en C++), ce n'est pas la même chose.ClasseFille
n'a qu'un seul champ:ClasseMere
(qui elle, contient un champm_attribut
). SiClasseFille
avait aussi un attributm_coucou
, alorsClasseFille
aurai deux champs:ClasseMere
etm_coucou
.Un constructeur de classe ne peut initialiser que ses propres champs. Donc
ClasseMere
doit initialiserm_attribut
etClasseFille
doit initialiserClasseMere
, en lui passant la référence en paramètre, par exemple.[^] # Re: ClasseMere est inutilisable.
Posté par Plume . Évalué à 2.
Effectivement, ça marche. Merci beaucoup !
[^] # Re: ClasseMere est inutilisable.
Posté par Michaël (site web personnel) . Évalué à 1. Dernière modification le 17 août 2013 à 19:04.
La réponse de BatchyX est très bien, si tu débutes en C++ et que tu causes un peu l'inglishe, je te rappelle l'existence de la FAQ
http://www.parashift.com/c++-faq/
et de l'anti-FAQ
http://yosefk.com/c++fqa/defective.html
qui explique pourquoi C++ est un langage tout pourri. (Ce qui n'empêche pas qu'on puisse avoir de bonnes raisons d'écrire un programme avec. Signé: un développeur C++.) C'est une lecture intéressante à cause de tous les pièges du langage qu'elle met en avant. Le premier document est la FAQ du Usenet comp.lang.c++ et a une version LITE.
# Notaire
Posté par phoenix (site web personnel) . Évalué à 1.
Bonjour,
Pour les problèmes d'héritage je vous conseil de voir un notaire.
[^] # Re: Notaire
Posté par NeoX . Évalué à 0.
aucun rapport donc j'"inutile" meme si j'ai bien ri ;)
[^] # Re: Notaire
Posté par Plume . Évalué à 0.
Je pense que former des professeurs d'informatique pour le lycée serait bien plus efficace !
(Mon professeur d'info était un professeur de math et physique. Après mon premier semestre en seconde, j'étais aussi compétent que lui. En première, c'est moi qui lui expliqué des programmes.
Après, il était vraiment très compétent en math et physique. C'est juste qu'il n'est pas prof d'info. )
[^] # Re: Notaire
Posté par NeoX . Évalué à 0.
par contre en francais, t'as manqué des cours ? ;)
[^] # Re: Notaire
Posté par Plume . Évalué à -1.
C'était un lycée allemand (un Gymnasium) :P
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.