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 :

Pointeur sur référence ?


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Pointeur sur référence ?
    Bonjour à tous.

    J'aurais voulu modifier la valeur d'une référence avec un pointeur, je m'explique.
    Je crée un objet qui à en attribut une référence, et je voudrais pouvoir modifier cette référence depuis une méthode de cet objet, comment est-ce faisable ? J'ai pensé à un pointeur sur référence mais je ne sais pas comment le mettre en place.

    Merci beaucoup.

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    En general on fait plutot des references sur pointeur mais bon... Tu peux modifier la valeur de la variable referencee, apres je pense qu'un exemple de code de ce que tu veux faire serait plus parlant parce que la je pense que tu veux faire un truc assez bizarre (ou alors tu t'es juste mal exprime ou je n'ai pas bien compris ta demande).

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Une référence référence toujours le même objet, déterminé à se création. C'est en grande partie l'intérêt des références par rapport aux pointeurs (car ainsi, on a la certitude qu'une référence référence toujours quelque-chose). Si tu veux pouvoir faire référence à des objets variables, utilise un pointeur plutôt.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    En gros, j'aimerais modifier (mettre à jour plus précisément) les balles tirées à chaque tour de boucle. Pour ce faire, j'ai créer une classe GameUpdate, et lorsque je l'initialise, elle prend un vector où sont stockés les balles tirées (qui est pour l'instant vide) puis à chaque tour de boucle, j'appelle la méthode update contenu dans GameUpdate pour qu'il mette à jour la position des balles. Le code sera peut-être plus explicite :
    main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* 
    ... includes et début du code
    */
    std::vector< Bullet > bulletsShot;
    GameUpdate gameState(app, bulletsShot);
    /* 
    ... d'autres initialisation et boucle de l'application
    */
    gameState.update(bulletsShot);
    /*
    ... fin de la boucle de l'appli
    */
    GameUpdate.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
     
    /* 
    ... includes
    */
    class GameUpdate
    {
        public:
            GameUpdate(sf::RenderWindow &app, std::vector<Bullet> &bulletsShot);
            virtual ~GameUpdate();
            void update();
        private:
            sf::RenderWindow *m_app;
            std::vector<Bullet> &m_bulletsShot;
    };
    GameUpdate.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
     
    /*
    ... includes
    */
    GameUpdate::GameUpdate(sf::RenderWindow &app, std::vector<Bullet> &bulletsShot)
    {
        m_app = &app;
        m_bulletsShot = &bulletsShot;
    }
    /*
    ...
    */
    void GameUpdate::update()
    {
        //Code qui est sensé modifier bulletsShot (et pas m_bulletShot)
        int i = 0;
        while(i < m_bulletsShot.size())
        {
            if(!m_bulletsShot[i].update(*m_app))
                m_bulletsShot.erase(m_bulletsShot.begin() + i);
            else
                i++;
        }
    }
    JolyLoic, en fait je vois pas trop la différence dans le code entre pointeur et référence, car les références on met & devant, et pour utiliser les pointeurs aussi...

    Merci.

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Citation Envoyé par Borax Kid Voir le message
    Je vois pas trop la différence dans le code entre pointeur et référence, car les références on met & devant, et pour utiliser les pointeurs aussi...
    Il faut bien distinguer & devant une variable qui permet de récupérer l'adresse de la variable et donc un pointeur. Et & après un type qui indique une référence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i = 0;
    int & r = i; //reference
    int * p = &i; // pointeur
    Aussi, les pointeurs peuvent changer la valeur pointé, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int i = 1;
    int i2 = 2;
    int * p = &i;
    *p = 3; // i égal maintenant 3
    p = &i2;
    *p = 4; // i2 égal maintenant 4
    Alors que les références ne peuvent pas changer la variable référencé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i = 1;
    int i2 = 2;
    int & r = i;
    r = 3; // i égal maintenant 3
    r = i2; // i égal maintenant 2
    r = 4; // i égal maintenant 4
    //i2 n'est jamais modifiée

  6. #6
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup mais il me reste un problème, dans ma fonction update, qui ressemble maintenant à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void GameUpdate::update()
    {
        int i = 0;
        while(i < m_bulletsShot->size())
        {
            if(! m_bulletsShot[i].update(*m_app))
                m_bulletsShot->erase(m_bulletsShot->begin() + i);
            else
                i++;
        }
     
    }
    J'ai un problème à la ligne 6, error: 'class std::vector<Bullet>' has no member named 'update'
    Ce devrait être la class Bullet et non la class std::Vector<Bullet>...

    Où me suis-je trompé ? (le reste du code est le même mis à part que m_bulletsShot est maintenant un pointeur)

  7. #7
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Si c'est un pointeur, tu dois faire comme ceci :


  8. #8
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, je me demandais pourquoi sans les parenthèses ça ne marchait pas, (avec l'astérisque), donc j'avais juste, mais pas totalement... C'est en faisant des erreurs qu'on retient le mieux hein!

    Merci encore!

  9. #9
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Il faut déréférencer le pointeur, sinon les crochets vont s'appliquer sur le pointeur et non pas sur le vector.

    m_bulletsShot[i] -> (*m_bulletsShot)[i]Tu peux également remplacer la boucle par un std::remove_if.

    Par contre, je ne vois pas l’intérêt d'un pointeur dans tous ça.

  10. #10
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2014
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Pour pouvoir changer la valeur du vector bulletsShot qui est dans mon autre fichier

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À moins de tricher de manière vraiment sale (ex. en trifouillant et castant un pointeur sur un objet contenant une référence), il est "impossible" d'avoir un pointeur sur une référence. La syntaxe & donnera forcément un pointeur sur l'objet référencé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/03/2015, 11h12
  2. Réponses: 11
    Dernier message: 14/05/2009, 14h07
  3. Pointeur sur référence ?
    Par koala01 dans le forum C++
    Réponses: 24
    Dernier message: 15/01/2008, 17h54
  4. Références et pointeurs sur un tableau
    Par smag dans le forum C++
    Réponses: 2
    Dernier message: 01/03/2005, 20h29
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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