Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2248 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  static_cast<> mal compris ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

static_cast<> mal compris ?

n°1968187
NathanGe
Posté le 22-02-2010 à 15:47:29  profilanswer
 

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

mood
Publicité
Posté le 22-02-2010 à 15:47:29  profilanswer
 

n°1968193
NathanGe
Posté le 22-02-2010 à 15:54:33  profilanswer
 

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'.

n°1968202
theshockwa​ve
I work at a firm named Koslow
Posté le 22-02-2010 à 16:11:04  profilanswer
 

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
n°1968216
NathanGe
Posté le 22-02-2010 à 16:27:20  profilanswer
 

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 ?
 

n°1968223
theshockwa​ve
I work at a firm named Koslow
Posté le 22-02-2010 à 16:40:23  profilanswer
 

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
n°1968235
bjone
Insert booze to continue
Posté le 22-02-2010 à 17:11:37  profilanswer
 

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
n°1968236
Malkav
Posté le 22-02-2010 à 17:13:53  profilanswer
 

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
n°1969401
in_your_ph​ion
Posté le 25-02-2010 à 17:47:48  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  static_cast<> mal compris ?

 

Sujets relatifs
FUNCTOR vs staticcast sur un pointeur de fonction
Methode staticstatic_cast objet fille pointeur
[Java] Probleme de castdynamic_cast et upcasting
[Probleme] Dynamic_cast<T>(x) - Unix Segfault[Problème] Static linking dans un makefile
Libxml++ : find and dynamic_cast 
Plus de sujets relatifs à : static_cast<> mal compris ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR