[Debutant] Heritage et appel de fonction

Heritage et appel de fonction [Debutant] - C++ - Programmation

Marsh Posté le 15-03-2006 à 16:25:14    

Bonjour,
J'essaye de bien comprendre l'héritage sous c++ alors je me suis fait un petit programme de base. J'ai donc une classe mammifere et une classe chat. La classe chat dérive donc de la classe mammifere. J'essaye de créer mon chat qui est donc un mammifere et d'afficher que c'est un type mammifere mais le compilateur me sors une erreur que je ne comprend pas :
 
cannot call member function `std::string Mammifere::GetType()' without object
 
Voici le code des 2 classes :
 
Classe Mammifere :

Code :
  1. #include <iostream>
  2. using namespace std;
  3. class Mammifere
  4. {
  5.       private:
  6.              int pattes;
  7.              string type;
  8.       public:
  9.              Mammifere()
  10.              {
  11.                 this->pattes = 4;
  12.                 this->type = "Mammifere";
  13.              }
  14.            
  15.              ~Mammifere()
  16.              {
  17.                 cout << "Destruction du mammifere" << endl;
  18.              }
  19.            
  20.              friend ostream & operator<<(ostream & os, const Mammifere & Mam)
  21.              {
  22.                 cout << "type: " << Mam.type << endl;
  23.                 cout << "Nombres de pattes: " << Mam.pattes << endl;
  24.                 return os;
  25.              }
  26.            
  27.              int GetNbrePattes()
  28.              {
  29.                  return pattes;
  30.              }
  31.            
  32.              string GetType()
  33.              {
  34.                  return type;
  35.              } 
  36. };


 
Classe Chat :

Code :
  1. #include <iostream>
  2. #include "Mammifere.cpp"
  3. using namespace std;
  4. class Chat : public Mammifere
  5. {
  6.       private:
  7.          string cri;
  8.          string couleur;
  9.      
  10.       public:
  11.          Chat() : Mammifere()
  12.          {
  13.             this->cri = "miaou";
  14.             this->couleur = "blanc";
  15.          }
  16.        
  17.          ~Chat()
  18.          {
  19.          }
  20.        
  21.          friend ostream & operator<<(ostream & os, const Chat & chat)
  22.          {
  23.             string type = Mammifere::GetType();    //<<< ERREUR ICI !!!!
  24.             //int pattes = Mammifere::GetNbrePattes();
  25.             //cout << "Le chat est un " << type << " avec " << pattes << " pattes." << endl;
  26.             //cout << "Son cri est " << cri << " et sa couleur est " << couleur << "." << endl;
  27.             return os;
  28.          }
  29. };


 
La ligne qui pose problème est indiqué ds le code par "<<< ERREUR ICI !!!!" juste au dessus. Merci de votre aide. Je pense que c'est pas grand chose mais je vois pas d'ou ca peut provenir.
 
Un grand merci a vous.
 
Groskachou


Message édité par groskachou le 15-03-2006 à 18:24:31
Reply

Marsh Posté le 15-03-2006 à 16:25:14   

Reply

Marsh Posté le 15-03-2006 à 18:31:20    

Personne pour m'aider ??

Reply

Marsh Posté le 15-03-2006 à 18:58:47    

chat->GetType()
 
ce n'est pas une bonne idée le friend la, il peut facilement etre évité, en plus tu fournies les méthodes d'accés aux membres
 
fais attention à ne pas oublier les destructeurs virtuels si tu comptes rendres tes classes polymorphiques


Message édité par skelter le 15-03-2006 à 18:59:06
Reply

Marsh Posté le 15-03-2006 à 19:57:28    

Code :
  1. #include <iostream>
  2. class Printable
  3. {
  4. public:
  5.   virtual void print(std::ostream &os) const = 0;
  6.   virtual ~Printable() { }
  7. };
  8. inline std::ostream & operator<<(std::ostream &os, const Printable &p)
  9. {
  10.   p.print(os);
  11.   return os;
  12. }
  13. class Document : public Printable
  14. {
  15. public:
  16.   virtual void print(std::ostream &os) const
  17.   {
  18.     os << "Document";
  19.   }
  20. };
  21. int main()
  22. {
  23.   Document d;
  24.   Printable &rp(d);
  25.   Printable *pp(&d);
  26.   std::cout << d << '\n'
  27.     << rp << '\n'
  28.     << *pp << '\n';
  29. }


Message édité par Taz le 15-03-2006 à 21:45:40
Reply

Marsh Posté le 15-03-2006 à 21:47:40    

Ok merci a toi pour ce code. J'avais trouvé aussi en faisant une simple fonction affiche.
Merci :)

Reply

Marsh Posté le 15-03-2006 à 22:10:40    

mais t'as pas du le faire bien (sans virtual, sans surcharge propre, sans const, etc)

Reply

Marsh Posté le 15-03-2006 à 22:17:30    

exact :D Rien de tout ca. Faudrait que je rajoute le virtual et le const dans mon cas de chat::affiche()
Faut que je vois encore comment fonctionne virtual. Haaa que c'est dur le passage java/c# à c++.
Merci quand meme de m'ouvrir les yeux sur mes oublis. C'est simpa :D

Reply

Marsh Posté le 16-03-2006 à 00:18:09    

groskachou a écrit :


Faut que je vois encore comment fonctionne virtual.


 
ok donc ta solution n'en ai pas une ...
 
 
et puis arrête tes bêtises avec classe::machin(). tu fais this->machin() et t'arrêtes de faire n'importe quoi. t'as rien bité au polymorphisme. fais  
 
Mammifère *m = new Chat();
cout << *m;
cout << m->GetType();
 
et pleure

Reply

Marsh Posté le 16-03-2006 à 01:29:38    

Classe::machin comme tu dis c'était l'un de mes nombreux test pour voir si ca marchait mais non...
J'aime pas trop le ton arrogant Taz... Je pense que certains connaissent mieux certains langages que d'autres et une simple explication aurait suffit pour que je comprenne.
Pour le moment j'ai vu ce qu'était la base canonique en c++ et je commence a passé à l'héritage. Le polymorphisme, c'est la prochaine étape.
Mais, en tout cas, un grand merci pour toutes vos précisions et vos conseils.


Message édité par groskachou le 16-03-2006 à 01:30:27
Reply

Marsh Posté le 16-03-2006 à 08:07:39    

y a pas d'héritage sans polymorphisme.

Reply

Marsh Posté le 16-03-2006 à 08:07:39   

Reply

Marsh Posté le 18-08-2006 à 23:03:14    

Taz tu connais pas endl ?

Reply

Marsh Posté le 18-08-2006 à 23:07:32    

dis moi drayell ... visiblement tu fais un tour dans les archives ? T'as l'air d'upper des topics de plus en plus vieux... celui la a + de 5 mois !

Reply

Sujets relatifs:

Leave a Replay

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