[C++] Classes polymères

Classes polymères [C++] - C++ - Programmation

Marsh Posté le 24-03-2006 à 11:45:09    

Compilé avec g++:

Code :
  1. #include <iostream.h>
  2. // classe polymère parente
  3. class Objet
  4. {
  5.   const char* monnom;
  6.   virtual void maClasse() { cout<<"Objet"<<endl; }
  7.   protected:
  8.   Objet& operator=(const Objet& o)
  9.   { *((char**)this)=*((char**)&o); return *this; }
  10.   public:
  11.   Objet(const char* nom): monnom(nom) {}
  12.   void quiSuisJe() { cout<<"Mon nom est "<<monnom<<", je suis un "; maClasse(); }
  13. };
  14. // deux classes polymères filles
  15. class ObjetA; class ObjetB;
  16. // classe polymère A
  17. class ObjetA: public Objet
  18. {
  19.   void maClasse() { cout<<"ObjetA"<<endl; }
  20.   public:
  21.   ObjetA(const char* nom): Objet(nom) {}
  22.   ObjetA& operator=(const ObjetB& b)
  23.   { Objet::operator=((Objet& )b); return *this; }
  24. };
  25. // classe polymère B
  26. class ObjetB: public Objet
  27. {
  28.   void maClasse() { cout<<"ObjetB"<<endl; }
  29.   public:
  30.   ObjetB(const char* nom): Objet(nom) {}
  31.   ObjetB& operator=(const ObjetA& a)
  32.   { Objet::operator=((Objet& )a); return *this; }
  33. };
  34. int main()
  35. {
  36.   ObjetA a("A" );
  37.   a.quiSuisJe();
  38.   ObjetB b("B" );
  39.   a=b;
  40.   a.quiSuisJe();
  41.   return 0+0==0;
  42. }


Cliquer dans le cadre blanc pour voir le résutat:

Spoiler :

Mon nom est A, je suis un ObjetA
Mon nom est A, je suis un ObjetB

:pt1cable: + :pt1cable: = :pt1cable:

Reply

Marsh Posté le 24-03-2006 à 11:45:09   

Reply

Marsh Posté le 24-03-2006 à 11:56:48    

et ?
 
ce genre d'écriture

Code :
  1. *((char**)this)=*((char**)&o)


en plus d'etre illisible c'est pas tres malin pour la protablilité, et c'est une classe d'objets polymorphiques, tu pourrais écraser  l'adresse de la vtable

Reply

Marsh Posté le 24-03-2006 à 11:58:18    

Ben, ça marche très bien...

Reply

Marsh Posté le 24-03-2006 à 12:02:56    

coup de chance
tu te rends compte que c'est unutile, dangereux et pas portable ?

Reply

Marsh Posté le 24-03-2006 à 12:04:55    

heu, c est pour ça que j ai précisé que c était compilé avec g++. il ya des méthodes portables de faire ça?

Reply

Marsh Posté le 24-03-2006 à 12:08:44    

monnom = o.monnom
 
on parles bien de la meme choses ?

Reply

Marsh Posté le 24-03-2006 à 12:12:59    

> monnom = o.monnom
ça marche pas


Message édité par nargy le 24-03-2006 à 12:21:52
Reply

Marsh Posté le 24-03-2006 à 12:29:07    

Code :
  1. Objet& operator=(const Objet& o)
  2. { monnom = o.monnom; return *this; }


 
ca marche
 
#include <iostream.h>
-->
#include <iostream>

Reply

Marsh Posté le 24-03-2006 à 12:37:10    

non, ça compile pas:
polymere.cpp:6: error: `cout' undeclared (first use this function)
Je doit pas avoir une bonne installation des librairies.


Message édité par nargy le 24-03-2006 à 12:51:10
Reply

Marsh Posté le 24-03-2006 à 13:45:47    

si tu fais #include <iostream.h>, tu peux utiliser tout ce que définit iostream (cin, cout, ...) directement.
 
Si tu fais #include <iostream>, tout ce que définit iostream est déclaré dans le namespace std. Du coup, il faut utiliser std::cout, std::cin, ... ou bien faire un "using namespace std"

Reply

Marsh Posté le 24-03-2006 à 13:45:47   

Reply

Marsh Posté le 24-03-2006 à 13:56:56    


Code :
  1. { *((char**)this)=*((char**)&o); return *this; }


 
[:pingouino][:pingouino][:pingouino][:pingouino][:pingouino][:pingouino]

Reply

Marsh Posté le 24-03-2006 à 13:57:52    

bon pis les char *, poubelle

Reply

Marsh Posté le 24-03-2006 à 13:58:35    

je viens de comprendres ce que tu fais, et c'est bien ce que je disais
 
avec ce code

Code :
  1. *((char**)this)=*((char**)&o);


tu affectes affectes la valeur du pointeur sur la vtable de this avec celle de o, ca explique l'affichage

Citation :


Mon nom est A, je suis un ObjetA
Mon nom est A, je suis un ObjetB --> le nom de a est toujours "A" mais l'appel de la methode virtuelle quiSuisJe passe par une indirection depuis la vtable de b


 
c'est quoi le but ?

Reply

Marsh Posté le 24-03-2006 à 13:58:42    

Code :
  1. return 0+0==0;


 
????? [:pingouino]

Reply

Marsh Posté le 24-03-2006 à 15:57:04    

Reply

Marsh Posté le 24-03-2006 à 16:23:41    

Taz a écrit :

polymères ?


C'est quand une classe herite de plusieurs classes mères ?  :whistle:

Reply

Marsh Posté le 24-03-2006 à 21:15:43    

Vous y avez cru aux classes polymères?

Citation :

c'est quoi le but ?


Rien qu'au ton de vos messages, je me suis tapé un bon fou rire. :lol:
 
> #include <iostream.h>
D'emblée ça commence mal... :)
 
> *((char**)this)=*((char**)&o);
...et là il y a de quoi dresser les cheveux sur la tête :lol:
 
> const char* monnom;
A fait, vous aviez supposé quoi là? :lol:
 
Merci aux participants :)
 
return  :pt1cable: + :pt1cable: == :pt1cable: ;

Reply

Marsh Posté le 25-03-2006 à 00:40:27    

rien pigé [:pingouino]

Reply

Marsh Posté le 25-03-2006 à 12:12:03    

on est une bande de jeunes, on rigole....

Reply

Marsh Posté le 26-03-2006 à 17:54:59    

Faut pas assigner les pointeurs mais faire une copie de la chaîne.
 
Quelle est la matière de ton polymère ??  :whistle:  Tu cherchais le terme "polymorphe" je suppose...


Message édité par slash33 le 26-03-2006 à 17:57:32
Reply

Sujets relatifs:

Leave a Replay

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