static_cast<> mal compris ?

static_cast<> mal compris ? - C++ - Programmation

Marsh Posté le 22-02-2010 à 15:47:29    

Bonjour,
 
Je cherche à faire une programme plus général que ces quelques lignes mais je pense déjà avoir mal compris le fonctionnement de la commande static_cast<>.
En effet, dans mon programme, j'ai une liste d'éléments d'une classe parent que je souhaite caster en des éléments d'une classe fille (tous les éléments de la liste parente doivent le permettre). Dans l'exemple simple suivant, je pensais pouvoir retrouver le résultat attendu, cad les mêmes informations que celles initialement connues :
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Article
  5. {
  6. public:
  7. int prix;
  8. };
  9. class Livre : public Article
  10. {
  11. public:
  12. string auteur;
  13. };
  14. void main()
  15. {
  16. // Creation de monlivre
  17. Livre monlivre;
  18. monlivre.prix = 20;
  19. monlivre.auteur = "Kant";
  20. cout << monlivre.prix << endl;
  21. cout << monlivre.auteur << endl;
  22. // Creation de monarticle
  23. Article monarticle = monlivre;
  24. Livre* ptlivre = static_cast<Livre*> (&monarticle);
  25. cout << ptlivre->prix << endl;
  26. cout << ptlivre->auteur << endl;
  27. }


 
Malheureusement, mon programme peut être compilée mais à l'exécution, la dernière commande, sur l'affichage de l'auteur bloque et produit un arret de l'éxecution.
 
Quelqu'un pourrait-il m'indiquer d'où vient ce comportement et s'il était attendu ? Je souhaiterais pourtant qu'il puisse s'éxécuter car, dans mon projet de programmation, j'aurais sans doute des opérations comparables à éxécuter.
 
 
D'avance merci pour votre aide

Reply

Marsh Posté le 22-02-2010 à 15:47:29   

Reply

Marsh Posté le 22-02-2010 à 15:54:33    

J'ai oublie de preciser que j'ai essayé d'utiliser également la commande :
 

Code :
  1. Livre* ptlivre = dynamic_cast<Livre*> (&monarticle);


 
Mais, la, le compilateur refuse de réaliser l'executable et renvoie un message indiquant que 'Article n'est pas un type polymorphe'.

Reply

Marsh Posté le 22-02-2010 à 16:11:04    

c'est normal : tu demandes à convertir monarticle, que l'on sait clairement ne pas être un Livre ... en un Livre. Ce code est faux.
 
le polymorphisme passe par l'utilisation de références ou de pointeurs.


---------------
last.fm
Reply

Marsh Posté le 22-02-2010 à 16:27:20    

Pourtant la ligne  
 

Code :
  1. Article monarticle = monlivre;


 
a indiquée que l'objet monlivre devrait être considéré comme un objet de la classe Article mais en gardant l'ensemble de ses attribus. Non ?
 
Y a t-il une autre manière de réaliser cette opérattion ?
 

Reply

Marsh Posté le 22-02-2010 à 16:40:23    

pas du tout. Tu as alloué sur ta pile un objet de type Article et tu as demandé à en faire une copie de monLivre.
 
 
Si tu veux manipuler ton instance monLivre sous forme d'article, tu dois passer par un :

Code :
  1. Article* monArticle = &monLivre;


 
attention à ce que tu fais avec les pointeurs. Suis bien la durée de vie des objets sur lesquelles tu gardes des pointeurs et références.


---------------
last.fm
Reply

Marsh Posté le 22-02-2010 à 17:11:37    

NathanGe a écrit :

Pourtant la ligne  
 

Code :
  1. Article monarticle = monlivre;


 
a indiquée que l'objet monlivre devrait être considéré comme un objet de la classe Article mais en gardant l'ensemble de ses attribus. Non ?
 
Y a t-il une autre manière de réaliser cette opérattion ?
 


 
Tu crée un nouvel Article qui récupère uniquement les propriétés d'Article de monlivre.
Dans cette situation, les propriétés supplémentaires de Livre sont donc perdues, et ne peuvent être en aucuns cas accédées.


Message édité par bjone le 22-02-2010 à 17:16:14
Reply

Marsh Posté le 22-02-2010 à 17:13:53    

comme le dit déjà theshockwave ta ligne  

Code :
  1. Article monarticle = monlivre;


est fausse (pour ce que tu veux faire)
 
Il te faut utiliser des pointeurs, mais étudie bien avant ce que çà recouvre, c'est une notion qui lorsque l'on débute n'est pas forcément facile à appréhender (je suppose que tu débutes).
 
En fait si tu as une liste d'articles par exemple std::list<Article> alors tu ne pourras pas y mettre des livres.
Par contre si c'est une liste de pointeurs tu pourras y mettre tout type d'article (y compris des classes dérivées comme les livres):
std::list<Article*>
 
Attention aux fuites mémoires avec les pointeurs.


Message édité par Malkav le 22-02-2010 à 17:15:11

---------------
Mes feedbacks * Ma galerie photo
Reply

Marsh Posté le 25-02-2010 à 17:47:48    

Livre est un type d'Article.  
 
Par conséquent, tu peux considérer qu'un objet Livre contient les champs de Article ET les champs de Livre. Un Livre est donc plus "grand" qu'un article :
 
Structure de la classe Livre:
 
|-------------------
|Article                 |
|--------------------
|Livre                   |
|-------------------
 
Or, tu demande de copier les contenu d'un livre dans celui d'un article, plus petit.  
 

NathanGe a écrit :


 Article monarticle = monlivre;


 
Problème : tout ne tient pas dedans. Les seuls champs qui seront recopiés dans monarticle serons ceux de Article dans ceux de monlivre.  :pt1cable:  
 
donc quand tu appel un champ de Livre après avoir casté, il n'a pas été copié dans ton objet Article et n'est pas existant.


Message édité par in_your_phion le 25-02-2010 à 17:56:06
Reply

Sujets relatifs:

Leave a Replay

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