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 :

vector de pointeurs d'objets


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    employé
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : employé
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 14
    Points
    14
    Par défaut vector de pointeurs d'objets
    Bonjour,

    je souhaiterai écrire dans l'idée le code suivant mai je n'arrive pas à écrire le destructeur
    si quelqu'un à une idée ou bien me dire si je suis à coté de la plaque
    merci

    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
    class A
    {
    public:
        A(int a);
     
    private:
        int m_a;
    };
     
    A::A(int a): m_a(a)
    {
     
    }
     
    class B
    {
    public:
        B();
        ~B();
     
    private:
        std::vector<B> *m_essai;
    };
     
    B::B():m_essai(new std::vector<B>)
    {
     
    }
     
    B::~B()
    {
        for(auto c:m_essai)
            delete C;
    }

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    B : un objet de type B.
    B * : un pointeur vers un objet de type B.
    std::vector<B> : un std::vector dont les éléments sont des objets de type B.
    std::vector<B> * : un pointeur vers un std::vector dont les éléments sont des objets de type B.

    Vois-tu comment déclarer ton vecteur pour obtenir ce que tu souhaitais initialement ?


    Lorsque tu auras compris comment déclarer tes pointeurs et collections de pointeurs, nous verrons pourquoi il convient dans ton cas de les remplacer par une construction de type shared_ptr ou unique_ptr..

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Déjà il faut se demander "pourquoi des pointeurs?"

  4. #4
    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
    - tu n'as pas de vector de pointeur mais un vector de B... dans B
    - un vector de B dans B, à part si tu écris un truc à base de node, json etc y'a peu de chance que ce soit correct
    - m_essai est vector*, ce qui n'a généralement aucun sens
    - à fortiori quand on l'initialise via new dans le constructeur
    - for(auto c:m_essai) delete C;> appelle delete sur une variable qui n'existe pas
    > et qui n'est pas du tout un pointeur, c'est tout au mieux un... B
    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.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Voici un exemple de vecteur de pointeur :

    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
     
    #include <vector>
     
    class A{
    public:
          int a;
          A(int a){
              this->a = a;
         }
    }
     
    int main(int argc, char *argv[]){
         vector<A*> list;
         list.push_back(new A(2));
    }
    Si tu a :

    vector<A> *list;

    et que tu veux détruire list, tu n'a qu'a faire :

    delete(list) ;

    mais si tu a :

    vector<A*> *list;

    Alors il faut faire :

    for(A *a : list)
    delete(a);
    delete(list);

  6. #6
    Membre à l'essai
    Homme Profil pro
    employé
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : employé
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    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
     
    class A
    {
    public:
        A(int a);
     
    private:
        int m_a;
    };
     
    A::A(int a): m_a(a)
    {
     
    }
     
    class B
    {
    public:
        B();
        ~B();
     
    private:
        std::vector<A> *m_essai;
    };
     
    B::B():m_essai(new std::vector<A>)
    {
     
    }
     
    B::~B()
    {
       delete m_essai;
    }
    merci pour vos réponses
    oui Bousk j'ai fait des grosses erreurs dans le code que j'ai tapé (Désoler)
    la class A est beaucoup plus grande que ce que j'ai donné comme exemple
    mais j'ai voulu simplifier

    En utilisant des pointeurs, je pense être dans la bonne direction. Mon but est de ne pas dupliquer des instances d'objets pour ne pas alourdir le programme
    en d'utilisant un tableau de pointeurs pour accéder aux donnés encapsulées dans la classe A par exemple.
    mais quand j'ai voulu taper mon destructeur en tapant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    B::~B()
    {
    delete m_essai;
    }
    ça a planté..
    (un unique_prt me semblle plus simple en effet)
    voilà par contre , ma syntaxe pour mon tableau de pointeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<A> *m_essai;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<A*> m_essai;
    je ne saisi pas bien la différence et le cour de C++ que j'ai récupéré
    est un peu vague sur ce point.
    si vous avez un petit conseil..ce serait sympa
    C'est mieux comme ça 😉

  7. #7
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    std::<vecto*> m_essai; wat ? C'est quoi ça, une faute de frappe ?

  8. #8
    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
    Nous sommes en 2017: Si ton vecteur doit "posséder" les objets pointés, alors autant faire un std::vector<std::unique_ptr<a>> plutôt qu'un vecteur de pointeurs nus.
    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.

  9. #9
    Membre à l'essai
    Homme Profil pro
    employé
    Inscrit en
    Juin 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : employé
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    OK j'ai bien compris
    merci pour vos conseilles
    bon weekend a tous

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/06/2013, 21h13
  2. vector d'objets ou vector de pointeurs sur objets
    Par manitor dans le forum Débuter
    Réponses: 7
    Dernier message: 16/02/2012, 21h41
  3. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54
  4. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 18h36

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