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 :

Tableau de pointeurs vers des objets


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut Tableau de pointeurs vers des objets
    bonjour,
    je me suis inspiré d'exemples dans la doc boost serialization pour coder en c++.
    J'ai donc une classe bus_route
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class bus_route
    {
    private:
        bus_stop* stops[10];
    public:
        bus_route(){}
        bus_stop* operator[](int);
    };
    J'instancie un objet de cette classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bus_route* ligne2a = new bus_route;
    Et j'aimerai instancier des objets de la classe bus_stop pour les stocker dans le tableau de pointeurs correspondant dans l'objet ligne2a en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bus_stop bs1(g10, g11);    //g10 et g11 sont des coordonnées
    *(ligne2a[0]) = &bs;
    J'ai donc surcharger l'opérateur [ ] dans bus_route de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bus_stop** bus_route :: operator[](int index)
    {
        return &stops[index];    //retourne l'@ du pointeur au rang index
    }
    En écrivant *(ligne2a[0]) = &bs; voire (*ligne2a)[0] = &bs; je pensais affecter le contenu de l'adresse pointé et donc le pointeur. A priori, je n'ai pas à surcharger l'opérateur d'affectation puisque je ne retourne pas un type classe.

    Je prend toutes les idées.
    Merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Tout d'abord, tu devrais utiliser un vector à la place d'un tableau de pointeur.
    Ça simplifie le code et ça t'autorises à avoir un nombre quelconque d'arrets (plus de limite à 10).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bus_stop bs1(g10, g11);    //g10 et g11 sont des coordonnées
    *(ligne2a[0]) = &bs;
    Fais attention avec ce genre de code, tu stock l'adresse d'un objet bus_stop, mais quand l'objet sera supprimé, l'adresse stockée sera invalide.
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(/*...*/) {
       bus_stop bs1(g10, g11);    //g10 et g11 sont des coordonnées
       *(ligne2a[0]) = &bs1;
    } // suppression de bs1
    Pour l'operator[], retourner une référence est préférable à un pointeur sur pointeur.

    Tu devrais avoir un truc dans le genre.
    Si tu dois partager des arrêts entre plusieurs lignes, utilise un vector<std::shared_ptr<bus_stop>>, vaut mieux éviter les pointeurs nus.
    Comme ça c'est la ou les lignes qui contiennent l'arrêt qui sont responsables de sa durée de vie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class bus_route {
        std::vector<bus_stop> stops;
     
    public:
        bus_route(){}
     
        void add(const bus_stop& bs) { stops.push_back(bs); }
     
        bus_stop& operator[](size_t ind) { return stops.at(ind); }
        const bus_stop& operator[](size_t ind) const { return stops.at(ind); }
    };

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Merci beaucoup,
    remarques très intéressantes, spécialement sur la partage des arrêts.
    J'avais gardé le tableau de pointeurs comme dans le source original mais ça me compliquait la vie plus qu'autre chose...

    Cordialement.

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

Discussions similaires

  1. Tableaux de pointeurs vers des objets
    Par Pinou421 dans le forum Débuter
    Réponses: 3
    Dernier message: 16/07/2013, 12h59
  2. Réponses: 2
    Dernier message: 18/07/2010, 11h43
  3. Passage de tableau de pointeurs vers objets
    Par gnulix dans le forum C++
    Réponses: 5
    Dernier message: 14/04/2007, 19h41
  4. Réponses: 4
    Dernier message: 04/02/2007, 00h06
  5. Réponses: 2
    Dernier message: 12/10/2006, 20h28

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