IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème avec const_cast


Sujet :

C++

  1. #1
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut Problème avec const_cast
    Bonjour à tous !


    Je ne suis pas vraiment expert en C++... Mais je dois utiliser la fonction const_cast. Voila mon programme :

    Mon fichier card.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #ifndef card_h
    #define card_h
     
    #include <string>
     
     
    /**********************************************************************************************************
     
                                                         Class card
                                                             
    **********************************************************************************************************/
     
    class card
    {
          public:
                 static const int vote;
                 static int additional_vote;
     
          public:
                 card(int add);
     
                 // QUESTION 12: I need at least one virtual function to make my class "card" polymorphic and be able to use "dynamic_cast"
                 virtual void vf_dynamic_cast();
     
    };
     
    #endif

    Fichier card.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <cstdlib>
    #include <iostream>
    
    #include "card.h"
    
    using namespace std;
    
    
    const int card::vote = 1;
    
    Première question : puis-je caster "additional_vote" de cette manière ?
    int card::additional_vote = 0;
    
    
    Ensuite, mon problème se situe dans cette méthode. J'ai essayé 36000 écritures différentes... Celle qui d'après moi aurait été la meilleure est la suivante :
    card::card(int add)
    {
                   int& test = *const_cast<int*>(&this->vote);
                   this->additional_vote = test + add;
    }
    
    
    void card::vf_dynamic_cast()
    {
         // Does not do anything
    }

    Je récupère une série de messages d'erreurs :
    [Linker error] undefined reference to `card::card()'
    Bref, je ne sais pas si j'ai été très clair... J'ai essayé de rendre mon problème le plus lisible possible.
    Excusez moi de la forme, si celle-ci n'est pas adaptée.
    Est-ce que quelqu'un saurait m'aider ?

    Si vous avez des questions, je reste disponible.

    Merci beaucoup pour toute implication, quelle qu'elle soit, par avance !


    Kimy from Ireland.
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonjour,

    Je pense que tu n'as pas besoin de cast ici, et ton problème doit être ailleurs, tu sembles faire un appel au constructeur par défaut alors qu'il n'existe pas.

  3. #3
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    En effet... même avec un code hyper simple, j'ai un soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    card::card(int add)
    {
                     this->additional_vote = add;
    }
    Une idée... C'est assez frustrant de ne pas comprendre pourquoi ça ne fonctionne pas...

    Erreur :
    [Linker error] undefined reference to `card::additional_vote'
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    J'ai trouvé une micro-solution :

    Mon card.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class card
    {
          public:
                 static const int vote;
                 static int additional_vote;
     
          public:
                 card();
     
                 // QUESTION 12: I need at least one virtual function to make my class "card" polymorphic and be able to use "dynamic_cast"
                 virtual void vf_dynamic_cast();
     
                 virtual void add_vote(int& add);
     
    };

    Mon card.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    const int card::vote = 1;
     
    int card::additional_vote = 0;
     
     
    card::card()
    {
     
    }
     
     
     
    void card::vf_dynamic_cast()
    {
         // Does not do anything
    }
     
     
     
    void card::add_vote(int& add)
    {
                    this->additional_vote = add++;
    }

    Une partie de mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        card ex_card = card();
        ex_card.add_vote(*const_cast<int*>(&ex_card.vote));
        cout << ex_card.vote << endl;
        cout << ex_card.additional_vote << endl;
    C'est super jolie tout ça, je n'ai plus de message d'erreur ! En revanche, le compilateur plante ! C'est la première fois que ça m'arrive !

    Une suggestion ?

    Merci beaucoup par avance !


    Kimy from Ireland.
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Edit en cour

  6. #6
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Hum... Je ne comprends pas...

    Si, mon constructeur par défaut existe... Il n'y a même rien dedant. Je veux créer une carte avec "vote" et "additional_vote" à respectivement 1 et 0.

    C'est pour cela que j'ai écrit ce code là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const int card::vote = 1;
     
    int card::additional_vote = 0;
    Après, je veux pouvoir modifier "additional_code" avec la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void card::add_vote(int& add)
    {
                    additional_vote = add++;
    }
    (J'ai enlevé le "this->" )

    Pour cela, je veux utiliser ma variable (qui n'est pas variable puisque je l'ai casté avec un "const") "vote" pour me forcer à utiliser "const_cast".

    Je ne sais toujours pas où est mon problème...

    Merci en tout cas !
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  7. #7
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Oui, j'avais mal lu, j'allais éditer

    Le problème c'est que tu modifies un objet constant, ce qui un UB (Undefined Behavior). Les const_cast ca doit uniquement servir à modifier un objet non-constant à travers un variable const-qualified.

  8. #8
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Donc, si j'ai bien compris, je ne peux pas utiliser mon const_cast ici ?

    Je te remercie en tout cas !!!
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Kimy_Ire Voir le message
    En effet... même avec un code hyper simple, j'ai un soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    card::card(int add)
    {
                     this->additional_vote = add;
    }
    Une idée... C'est assez frustrant de ne pas comprendre pourquoi ça ne fonctionne pas...

    Erreur :
    additional_vote est static et n'est donc pas utilisable avec this
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo