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

Boost C++ Discussion :

Problème boost shared_ptr et make_shared


Sujet :

Boost C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 62
    Points : 34
    Points
    34
    Par défaut Problème boost shared_ptr et make_shared
    Bonjour,
    J'ai un projet c++ 11 qui marche avec Visual Studio 2012 ou supérieur.
    Je voudrais le faire tourner sur Visual Studio 2010 avant la norme c++ 11.
    Voici les fichiers de codes :
    personneh.txtpersonnecpp.txtlogementh.txtlogementcpp.txt
    J'ai le message d'erreur suivant :
    erreur VS 2010.txt
    En C++ 11 le code problématique était le suivant :
    logementcpp11.txt
    D'avance merci de votre aide.
    Cdt

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 571
    Points : 7 684
    Points
    7 684
    Par défaut
    Bonjour,

    Il est plus lisible de mettre directement du code plutôt que des fichiers texte.
    Sinon, i est un iterateur sur des pointeurs pour l'utiliser il manque un déréférencement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for ( std::set<Personne*>::iterator i=occupants.begin() ; i!=occupants.end() ; ++i ) {
        flux << (**i).ToString() << ',';
        // ou bien
        flux << (*i)->ToString() << ',';
    }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 62
    Points : 34
    Points
    34
    Par défaut Merci - autre problème shared_ptr bibliothèque boost c++ avant norme 11
    Merci,
    Je n'ai plus de message d'erreur mais avec les shared_ptr de boost, le main affiche à la console des listes ToString vides.
    Voici les fichiers sources :
    personne.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
    #ifndef PERSONNE_H
    #define PERSONNE_H
    #include <string>
     
    class Logement;
     
    class Personne
    {
        std::string identite;
        Logement *residence;
    public:
        Personne(std::string id);
        std::string ToString() const;
        void Emmenage(Logement *l);
     
    };
     
    #endif // PERSONNE_H
    personne.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
    #include "personne.h"
    #include "logement.h"
    #include <sstream>
     
    Personne::Personne(std::string id):identite(id),residence(nullptr)
    {
    }
     
    void Personne::Emmenage(Logement *l)
    {
        if(residence!=nullptr)
            residence->Depart(this);
        residence = l;
        if(residence!=nullptr)
            residence->Arrivee(this);
    }
     
    std::string Personne::ToString() const
    {
       std::ostringstream flux;
       flux << identite;
       if(residence!=nullptr)
       {
           flux << " ("<<residence->ToString()<<")";
       }
       return flux.str();
    }
    logement.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
    #ifndef LOGEMENT_H
    #define LOGEMENT_H
    #include <string>
    #include <set>
     
    class Personne;
     
    class Logement
    {
        std::string adresse;
        std::set<Personne*> occupants;
    public:
        Logement(std::string ad);
        std::string ToString() const;
        void Arrivee(Personne* p);
        void Depart(Personne *p);
        std::string ListeOccupants() const;
    };
     
    #endif // LOGEMENT_H
    ogement.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
    #include "logement.h"
    #include "personne.h"
    #include <sstream>
     
    Logement::Logement(std::string ad):adresse(ad)
    {
    }
     
    std::string Logement::ToString() const
    {
        return adresse;
    }
     
    void Logement::Arrivee(Personne *p)
    {
        occupants.insert(p);
    }
     
    void Logement::Depart(Personne *p)
    {
        occupants.erase(p);
    }
     
    std::string Logement::ListeOccupants() const
    {
        std::ostringstream flux;
    	std::set<Personne*> occupants;
        for(std::set<Personne*>::iterator i=occupants.begin();i!=occupants.end();++i)
        {
            flux << (*i)->ToString() << ',';
        }
        return flux.str();
    }
    ville.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
    #ifndef VILLE_H
    #define VILLE_H
    #include <set>
    #include <string>
    #include <boost/smart_ptr/shared_ptr.hpp>
     
    class Logement;
     
    class Ville
    {
        std::set<boost::shared_ptr<Logement> > logements;
     
    public:
        Ville();
        std::string ListeLogements() const;
        Logement* CreeLogement(std::string adresse);
    };
     
    #endif // VILLE_H
    ville.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
    #include "ville.h"
    #include "logement.h"
    #include <boost/smart_ptr/shared_ptr.hpp>
    #include <boost/smart_ptr/make_shared.hpp>
    #include <sstream>
     
    Ville::Ville()
    {
    }
     
    std::string Ville::ListeLogements() const
    {
        std::ostringstream flux;
    	std::set<boost::shared_ptr<Logement> > logements;
        for(std::set<boost::shared_ptr<Logement>>::iterator i=logements.begin();i!=logements.end();++i)
        {
             flux << (*i)->ToString() << ',';
        }
        return flux.str();
     
    }
     
    Logement* Ville::CreeLogement(std::string adresse)
    {
        boost::shared_ptr<Logement> l = boost::make_shared<Logement>(adresse);
        logements.insert(l);
        return l.get();
    }
    main.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
    #include <iostream>
    #include "ville.h"
    #include "personne.h"
    #include "logement.h"
     
    using namespace std;
     
    int main()
    {
    	char z;
        cout << "Bienvenue dans ma ville !" << endl;
        Ville city;
        Logement *l1 = city.CreeLogement("15, rue des fleurs");
        Personne p1("paul"),p2("john"),p3("georges"),p4("ringo");
     
        p1.Emmenage(l1);
        p2.Emmenage(l1);
        p3.Emmenage(l1);
        p4.Emmenage(l1);
     
        cout << "Occupants de l1 (normalment 4)"<<endl;
        cout << l1->ListeOccupants() << endl;
     
        Logement *l2 = city.CreeLogement("23 rue des roses");
        p2.Emmenage(l2);
        cout << "Affichage d'une personne :"<<p2.ToString() << endl;
        cout << "Occupants de l1 (3) :"<<l1->ListeOccupants() << endl;
        cout << "Occupants de l2 (1) :"<<l2->ListeOccupants() << endl;
     
        cout << "Liste des logements : ";
        cout << city.ListeLogements()<<endl;
    	cin >> z;
        return 0;
    }

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 571
    Points : 7 684
    Points
    7 684
    Par défaut
    Bonjour,

    La ligne 27 dans Logement.cpp vient créer un objet local occupants qui masque le vrai Logement::occupants!

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 62
    Points : 34
    Points
    34
    Par défaut Problème résolu
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    La ligne 27 dans Logement.cpp vient créer un objet local occupants qui masque le vrai Logement::occupants!
    Merci dalfab !
    En supprimant la ligne 27 de logement cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     std::ostringstream flux;
    	/*std::set<Personne*> occupants;*/
        for(std::set<Personne*>::iterator i=occupants.begin();i!=occupants.end();++i)
        {
            flux << (*i)->ToString() << ',';
        }
        return flux.str();
    et en supprimant la ligne 14 de ville cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::ostringstream flux;
    	/*std::set<boost::shared_ptr<Logement> > logements;*/
        for(std::set<boost::shared_ptr<Logement>>::iterator i=logements.begin();i!=logements.end();++i)
        {
             flux << (*i)->ToString() << ',';
        }
        return flux.str();
    qui sont des membres privés inaccessibles sauf pour les membres publics de la Classe,

    Le programme s'exécute normalement !
    Merci encore.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/10/2010, 09h54
  2. F# sera inclus dans Visual Studio 2010
    Par LLB dans le forum F#
    Réponses: 7
    Dernier message: 16/06/2010, 13h43
  3. UML class Diagram dans visual studio 2010
    Par obiflo dans le forum Visual Studio
    Réponses: 3
    Dernier message: 09/06/2010, 16h08
  4. LINQ dans Visual Studio 2010
    Par narglix dans le forum C#
    Réponses: 1
    Dernier message: 20/02/2010, 20h02
  5. fsharp web application dans visual studio 2010
    Par aymen.selmi dans le forum Visual Studio
    Réponses: 7
    Dernier message: 09/10/2009, 16h39

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