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

SL & STL C++ Discussion :

[vector] Partager une même variable entre deux objets.


Sujet :

SL & STL C++

  1. #1
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut [vector] Partager une même variable entre deux objets.
    Salut,
    J’ai un gros souci, qui est pas mal dur a expliquer mais je vais essayer de faire de mon mieux.
    Alors voila.

    J’ai une class (Celements) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Celements
    {
     
        public :
            int x,y,z ;
            std::vector <Cobjet> objet;
     
            ...
            ...
            ...
    }
    Cobjet c’est une class banale.

    De cette manière là, chaque objet de la class Celements créé aura son propre vector « objet ».

    Dans mon programme je déclare en tout 3 objet de la class Celements mais j’aimerai que deux d’entre eu partage le meme vector « objet ».
    Sous forme d’image cela peu se représenter comme ça :

    on se retrouverait donc avec Elements[0].objet == Elements[1].objet != Elements[2].objet
    et Elements[0].x != Elements[1].x != Elements[2].x (pareille pour y et z)

    Pour faire cela, j’ai déjà pensé à une petite idée.
    Déclarer un pointeur de vector dans Celements puis créé deux constructeurs.
    Le 1ere sans arguments et dans se cas la, on créé un vector et envoie l’adresse du pointeur au pointeur de vector de la Celements.
    Le 2eme avec un argument contenant l’adresse d’un vector et envoyer cette adresse au pointeur de vector de la Celements.

    Un truk du style :
    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
     
    class Celements
    {
     
        public :
            int x,y,z ;
            Cobjet * objet;
     
            Celements()
            {
                std::vector <Cobjet> nn;
                objet = &(nn);            
            }
     
            Celements(Cobjet *np)
            {
                objet = np;          
     
            }
            ...
            ...
            ...
    }
    Mais évidement cela ne marche pas... il faudrait dans ce cas définir objet comme un pointeur de vector et non pas comme un pointeur de Cobjet.

    Avait vous une idée de comment je pourrais faire ?

    Merci

  2. #2
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    il faudrait dans ce cas définir objet comme un pointeur de vector et non pas comme un pointeur de Cobjet.
    Pourquoi n'as tu pas essayé cette solution ?

  3. #3
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    strabest> pke je ne sais pas comment faire pour definir un pointeur de vector... serais tu ?

  4. #4
    Membre averti
    Avatar de Strab
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 338
    Points : 330
    Points
    330
    Par défaut
    Ben en fait non, je ne connais que le C.

    Mais comme ça, au vu de ton code, je dirais :
    std::vector <Cobjet> * objet;

    Non ?

  5. #5
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    À vrais dire je ne sais pas trop... le fait de faire :
    std::vector <Cobjet> * objet;
    Créerait plutôt un tableau dynamique de pointeur de class Cobjet...

  6. #6
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par Ekinoks
    À vrais dire je ne sais pas trop... le fait de faire :
    std::vector <Cobjet> * objet;
    Créerait plutôt un tableau dynamique de pointeur de class Cobjet...
    machin *objet peut avoir plusieurs significations, parmi lesquelles
    - un pointeur sur une instance de la classe machin
    - un pointeur sur le début d'un tableau contenant des machins

    dans notre cas, std::vector <Cobjet> * objet; nous donnerait soit un pointeur sur un vector de Cobjet soit un pointeur sur un tableau dynamique de vector de Cobjets

    donc, il est possible de procéder de cette manière, bien qu'elle ne soit pas très élégante.
    Ne serait-il pas plus intéressant de créer le vector comme partie d'une autre classe, pour n'avoir plus qu'un seul constructeur ? enfin après tout dépend de ce que tu veux faire.

    Prend tout de même garde à ne pas avoir d'accès concurrents sur l'objet partagé.

  7. #7
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Salut et merci pour vos réponses.
    Malgré vos réponses, je n'arrive toujours pas à faire ce que je veux :^/ pouvais vous me donner un exemple ?

    Merci

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Ekinoks
    Salut et merci pour vos réponses.
    Malgré vos réponses, je n'arrive toujours pas à faire ce que je veux :^/ pouvais vous me donner un exemple ?
    On t'a expliqué et donné la syntaxe à utiliser. Donc... Quel est le problème que tu rencontres maintenant ?

  9. #9
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Salut,
    Alors voila, j'ai essayé de faire un truc comme ça :
    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
     
    class Celements
    {
     
        public :
     
            std::vector <Cobjet> * objet;
     
            Celements () 
            {
                objet = new std::vector <Cobjet>;
            }
     
            Celements (std::vector <Cobjet> *pointeur) 
            {
                objet = pointeur;
            }
            void Fonction (void)
            {
                ...
                ...
                ...
                for (tmp=0;tmp<objet[0].size();tmp++)
                {
                    glLoadName(id);
                    objet[0][tmp].afficher();
                    id++;
                }
                ...
                ...
                ...
            }
    (Je déclare mon objet de class "Celements" sans argument)

    Avec ce code la, j'ai une erreur de memoir :
    La mémoir ne peut pas étre "read"
    Je suppose que j'ai du faire une erreur avec le pointeur d'objet et tout le tralala

    Merci

  10. #10
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    D’ailleur, j'ai essayé de faire la même chose mais en passent par une class cela donne :
    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
     
    class Cvector
    {
        public :
            std::vector <Cobjet> objet; 
    };
     
     
    class Celements
    {
     
        public :
     
            Cvector * objets;
     
            Celements () 
            {
                objets = new Cvector;
            }
     
            Celements (Cvector * tmp) 
            {
                objets = tmp;
            }
     
            void Fonction (void)
            {
                ...
                ...
                ...
                for (tmp=0;tmp<objets[0].objet.size();tmp++)
                {
                    glLoadName(id);
                    objets[0].objet[tmp].afficher();
                    id++;
                }
                ...
                ...
                ...
            }
    Avec ce code la, cela me donne la même erreur de mémoire :^/

    Avez vous une idée de la ou ca peu venir ?

    Merci

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ton code n'a pas l'air mauvais. A mon avis le plantage vient à la destruction, lorsqu'on partage une ressource dynamique entre plusieurs objets il faut une gestion bien particulière (comptage de référence). Utilise le debugger pour avoir plus de précisions sur le code qui produit l'erreur.

    A part ça, pour accéder aux données d'un pointeur sur un seul objet (et non un tableau), c'est obj->xxx et non obj[0].xxx, même si techniquement c'est la même chose.

  12. #12
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Salut,

    Merci pour l'info =)

    Alors voila j'ai lancé le débuguer et j'obtiens l'erreur :
    une violation d'accès (erreur de segmentation) est apparue dans votre programme.
    Dans le ficher source "stl_vector.h" a la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    begin() const { return const_iterator (this->_M_impl._M_start); }
    J’avoue que je ne voie pas trop a quoi correspond cette erreur et comment y remédier...

    PS : l'erreur se produit lorsque je lance mon programme, il ne devrait en principe pas avoir de destruction de class...

    RE PS : apparament, l'erreur se produit lorsque je fait appelle a "objets->objet.size()" et "objets->objet[tmp].afficher()"

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Les pointeurs c'est délicat. Tu as un problème lié à une adresse invalide.
    Les pointeurs intelligents peuvent te simplifier la tâche:
    http://c.developpez.com/faq/cpp/?pag...S_intelligents

  14. #14
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Aurelien.Regat-Barrel> apparemment, les pointeurs intelligents ne son pas recommandé dans mon cas pour les transfère de pointeur (objets = tmp

  15. #15
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Je pensais à ceux de boost (shared_ptr, voir la FAQ). Ca nécessite d'installer boost (sans le compiler celà dit), mais ça simplifie beaucoup ton code.
    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
     
    typedef std::vector<Cobjet> Cvector;
    typedef boost::shared_ptr<Cvector> CvectorPtr;
     
    class Celements 
    { 
    public :         
        CvectorPtr objets; // private plutot non ?
     
        Celements () :
            objets( new Cvector )
        { 
        } 
     
        // a la limite ce constructeur ne sert à rien si tu utilises
        // le constructeur de recopie par défaut
        Celements ( const CvectorPtr & tmp )
            objets( tmp )
        { 
        }
    note que tu n'as pas besoin de faire le delete objets, chose nécessaire (et non faite!) dans ton code. De même la copie de Celements ne pose pas de problème ici.

  16. #16
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    Ok, c'est bon, j'ai trouvé... le problème venait d'un autre endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Celements elements[3];
    ...
    ...
    ...
    elements[3].afficher();
    Effectivement ce n'ai vrément pas très jolie :^/ et en plus le compilateur ne voie même pas qu'il y a un problème...

    Merci beaucoup a tout le monde pour votre aide =)

  17. #17
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Tu peux utiliser std::vector et sa fonction membre at() qui vérifie que tu n'est pas en dehors des limites.

  18. #18
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    oui, c'est ce que je fait generalement, mais pour un petit tableau non dynamique de 3 elements, c'est un peu domage d'utiliser les vectors :^/

  19. #19
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    boost.array ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2014, 19h26
  2. [Débutant] Partager une même propriété entre plusieurs classes
    Par BasicZX81 dans le forum VB.NET
    Réponses: 4
    Dernier message: 09/09/2012, 15h56
  3. Partager la même position entre deux sprites
    Par Takumi dans le forum XNA/Monogame
    Réponses: 3
    Dernier message: 21/10/2010, 12h19
  4. Partager une variable entre deux sites web
    Par debutantasp dans le forum ASP
    Réponses: 3
    Dernier message: 12/05/2008, 20h03
  5. Comment partager une même form entre 2 projets ?
    Par WebPac dans le forum Windows Forms
    Réponses: 5
    Dernier message: 31/12/2007, 16h17

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