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 :

Usage des pointeurs dans un objet


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 34
    Par défaut Usage des pointeurs dans un objet
    Bonsoir,
    j'ai des difficultés à obtenir un code fonctionnel qui consiste à remplir un simple vector en utilisant le pointeur (membre private de ma classe ) qui pointe dessus.
    Voilà mon code:


    Le fichier flux.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
     
    #include <iostream>
     
     
    #include <vector>
     
     
     
    class img_stream {
        public:
            img_stream();
            ~img_stream();
     
            void fill_stream(int img);
     
            void cout_stream();
     
        private:
            std::vector<int>* img_queue;
     
    };

    Le fichier flux.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
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include "flux.h"
     
     
     
     
    img_stream::img_stream()
    {
        std::vector<int>* img_queue = new std::vector <int> (0) ; //On crée un tableau vide
     
    }
     
     
    img_stream::~img_stream()
    {    
    }
     
    void img_stream::fill_stream(int img){
       unsigned int size = static_cast<int>(this->img_queue->vector::size());
       std::cout << size << std::endl;
       while(size < 2){                                            //Initialement, j'avais utilisé le while en comparant directement la valeur de img_queue->size() mais cela affichait une erreur 
       this->img_queue->vector::push_back(img);   // car size() serait constant.
       size +=4;
       }
     
    }
     
     
     
    void img_stream::cout_stream()
    {
     
        for(std::vector<int>::iterator it = this->img_queue->begin(); it!=this->img_queue->end(); it++){
        std::cout << *it << std::endl;
        }

    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
     
     
     
    Le fichier main.cpp:
     
    #include "flux.h"
    #include <vector>
     
     
     
    int main(){
     
     
        img_stream flux ;
     
        int T = 3;
     
        flux.img_stream::fill_stream(T);
     
        flux.img_stream::cout_stream();
     
    }
    Je ne suis pas à l'aise avec les pointeurs et je ne parviens pas à comprendre ce que la console affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    4253334149              \\Je m'attendais à trouver 2 ici       
    Erreur de segmentation
    En ce qui concerne l'erreur de segmentation voilà ce que j'obtiens avec valgrind:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    !Damien@Damien-ThinkPad-X200:~/Documents/projet$ valgrind ./a.out --leak-check=full      
    ==7998== Memcheck, a memory error detector
    ==7998== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
    ==7998== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
    ==7998== Command: ./a.out --leak-check=full
    ==7998== 
    ==7998== Use of uninitialised value of size 8
    ==7998==    at 0x401034: std::vector<int, std::allocator<int> >::size() const (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400E3B: img_stream::fill_stream(int) (in /home/Damien/Documents/projet /a.out)
    ==7998==    by 0x400CA1: main (in /home/Damien/Documents/projet/a.out)
    ==7998== 
    ==7998== Use of uninitialised value of size 8
    ==7998==    at 0x40103F: std::vector<int, std::allocator<int> >::size() const (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400E3B: img_stream::fill_stream(int) (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400CA1: main (in /home/Damien/Documents/projet/a.out)
    ==7998== 
    4253334149
    ==7998== Use of uninitialised value of size 8
    ==7998==    at 0x40159C: __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(int* const&) (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x4010E7: std::vector<int, std::allocator<int> >::begin() (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400EA9: img_stream::cout_stream() (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400CAD: main (in /home/Damien/Documents/projet/a.out)
    ==7998== 
    ==7998== Use of uninitialised value of size 8
    ==7998==    at 0x40159C: __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(int* const&) (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x401133: std::vector<int, std::allocator<int> >::end() (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400EBC: img_stream::cout_stream() (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400CAD: main (in /home/Damien/Documents/projet/a.out)
    ==7998== 
    ==7998== Invalid read of size 4
    ==7998==    at 0x400EE4: img_stream::cout_stream() (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400CAD: main (in /home/Damien/Documents/projet/a.out)
    ==7998==  Address 0x41ff894156415741 is not stack'd, malloc'd or (recently) free'd
    ==7998== 
    ==7998== 
    ==7998== Process terminating with default action of signal 11 (SIGSEGV)
    ==7998==  General Protection Fault
    ==7998==    at 0x400EE4: img_stream::cout_stream() (in /home/Damien/Documents/projet/a.out)
    ==7998==    by 0x400CAD: main (in /home/Damien/Documents/projet/a.out)
    ==7998== 
    ==7998== HEAP SUMMARY:
    ==7998==     in use at exit: 72,728 bytes in 2 blocks
    ==7998==   total heap usage: 3 allocs, 1 frees, 73,752 bytes allocated
    ==7998== 
    ==7998== LEAK SUMMARY:
    ==7998==    definitely lost: 24 bytes in 1 blocks
    ==7998==    indirectly lost: 0 bytes in 0 blocks
    ==7998==      possibly lost: 0 bytes in 0 blocks
    ==7998==    still reachable: 72,704 bytes in 1 blocks
    ==7998==         suppressed: 0 bytes in 0 blocks
    ==7998== Rerun with --leak-check=full to see details of leaked memory
    ==7998== 
    ==7998== For counts of detected and suppressed errors, rerun with: -v
    ==7998== Use --track-origins=yes to see where uninitialised values come from
    ==7998== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 0 from 0)
    Erreur de segmentation
    Merci d'avance de votre aide!

    Cordialement.

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonjour.

    Quand tu écris ce constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    img_stream::img_stream()
    {
        std::vector<int>* img_queue = new std::vector <int> (0) ; //On crée un tableau vide
     
    }
    Tu ne modifies absolument pas la variable membre img_queue mais tu en créés une nouvelle (et tu créés une fuite mémoire) !
    Tu pourrais juste supprimer la partie std::vector<int>* mais pourquoi diable passer par un pointeur de vector alors que ça n'a aucun intérêt ici ?

    Utilise un simple vector comme variable membre et ça irait mieux.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 34
    Par défaut
    Bonjour,
    merci pour la réponse, en effet sous l'ide le "nouveau" img_queue était souligné en vert mais je n'y avais pas prêté attention...

    En ce qui concerne le pointeur vers le vector, je l'utilise car j'ai d'autres classes dans mon programme qui copient l'adresse de ce pointeur pour accéder au tableau.

    Cordialement.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Gwynbleidd Voir le message
    Bonjour,
    merci pour la réponse, en effet sous l'ide le "nouveau" img_queue était souligné en vert mais je n'y avais pas prêté attention...

    En ce qui concerne le pointeur vers le vector, je l'utilise car j'ai d'autres classes dans mon programme qui copient l'adresse de ce pointeur pour accéder au tableau.

    Cordialement.
    Humm... mauvaise idée...

    Tu as placé ton tableau dans l'accessibilité privée de ta classe. Cela signifie, en gros, que tu as décidé "ce tableau, il appartient aux instances de la classes, et à elles seules".

    Et, après, tu décides que "ben, non, tout comptes faits, on va partager ce tableau avec d'autres classes, dont on ignore tout", ce qui va -- très clairement -- à l'encontre de ta décision d'origine.

    Alors, de deux choses l'une: ou bien ta décision d'origine était sensée, et les autres classes n'ont pas à aller chipoter à ton tableau, ou bien tu as pris une mauvaise décision à l'origine, et ce tableau doit se trouver "quelque part" d'où l'on pourra s'assurer que "tout ce qui y accède" le fait dans les règles.

    Dans le deuxième cas de figure, plutôt que de fournir un pointeur vers le tableau, pourquoi ne pas le transmettre comme paramètre aux seules fonctions qui en ont besoin, voire, si une classe ne peut exister sans en disposer, en créer un membre sous forme de référence
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Si par le plus grand des hasards une autre classe a besoin de récupérer le pointeur d'un membre, c'est exactement pour ça qu'il existe un opérateur & qui permet de récupérer un pointeur.
    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.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 34
    Par défaut
    Bonsoir,
    effectivement ce n'est pas très propre...
    Je souhaite garder mon tableau uniquement modifiable par mes classes qui pourront en copier le pointeur: le tableau ne serait pas accessible en dehors des classes.
    Donc, il faut que je leur donne un moyen d'y accéder.

    Par contre, je ne comprends pas la notion de passage par référence d'un membre de classe (je comprends quand il s'agit d'une fonction mais pas dans ce cas ci): pourriez vous donner un petit exemple s'il vous plaît?

    Enfin, dernière question : Si on passe par référence le membre de la classe, cela revient à faire la même sorte de "bidouillage" qu'en copiant des adresses mémoires non? Je ne comprends pas vraiment pourquoi on préférerait les références aux pointeurs si c'est pour aboutir à un résultat similaire.

    Cordialement.

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

Discussions similaires

  1. Usage des pointeurs dans les fonctions
    Par didou31 dans le forum Débuter
    Réponses: 12
    Dernier message: 22/11/2011, 13h31
  2. Ajouter des données dans un objet Listbox
    Par nuans dans le forum Interfaces Graphiques
    Réponses: 11
    Dernier message: 23/05/2007, 11h49
  3. Réponses: 2
    Dernier message: 21/02/2007, 13h28
  4. Ecrire des valeurs dans un objet OLE Excel
    Par NewbiePower dans le forum Access
    Réponses: 4
    Dernier message: 08/02/2007, 08h59
  5. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42

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