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

Langage C++ Discussion :

Creer plusieurs instance de "même nom"


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut Creer plusieurs instance de "même nom"
    Bonjour à tous!

    J'ai parcouru différents forum et je n'ai pas vraiment trouvé la réponse à ma question, désolé

    J'ai une classe A, dans laquelle je vais instancier plusieurs classe B
    En gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A
    {
     
    private:
    //constructeur etc etc...
     
    void creer_objet(int ID) // dedant, j'aurai: objet * nouveau objet etc etc)
    void getObjetAtId(int ID) // c'est là que je rame
     
    public:
    // mes attributs....
     
    })
    donc voilà, je vais pouvoir créer plusieurs instance de Objet à l’intérieur de ma classe A, et ce qui va les différencier sera l'ID (le premier aura ID=1, le 2ème ID=2 etc etc...)

    Ma question est: lorsque je serai sur l'item 5 d'un menu déroulant par exemple, comment puis-je trouver l'objet en question qui aura ID=5 pour interagir avec?
    Mon niveau de C++ est assez moyen..j'ai pensé à une boucle for mais je pense qu'il y a plus simple

    Autre question, si je serialise mon instance de ma classe A pour l'écrire dans un fichier, etc-ce que mes instances de "Objet" seront sauvegarder avec?

    Merci d'avance pour votre aide

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Dans quel attribut les objets sont-ils créés ?
    Quel est le type de cet attribut ?

    Autre question, si je serialise mon instance de ma classe A pour l'écrire dans un fichier, etc-ce que mes instances de "Objet" seront sauvegarder avec?
    Si tes instances "Objet" sont sérialisables, alors oui, tu peux faire en sorte qu'ils soient sauvegardés.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Aie simplement un membre std::map templatisé par le type de tes objets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
        private:
            std::map<MonType> monMap;
     
        public:
            void creer_objet(int ID) { monMap[id] = MonType(); }
            MonType& getObjetAtId(int ID) { return monMap[id]; }
    };
    Dans ce cas là, l'encapsulation n'a que peu d'intérêt.
    A rajouter éventuellement les versions const, et utiliser des itérateurs.

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Vu que tes ID sont contigus, tu peux faire simple :

    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
    class A
    {
        private:
            std::vector<MonType> monVector;
     
        public:
            void creer_objet() { monMap.push_back(MonType()); }
            MonType& getObjetAtId(int ID) 
           {
             if(ID >= monVector.size())
               // Traiter le problème éventuellement..
               throw std::logic_error();
             return monMap[ID-1]; 
           }
    };
    Si tes ID ne sont pas contigus alors la solution d'oodini est la meilleure, il y a juste une coquille dans son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<int, MonType> monMap;
    N'oublie pas d'inclure #include <vector> ou #include <map> selon ce que tu utiliseras.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut
    Merci pour vos réponse, c'est sympa

    Par contre oulala, je vous avoue que tout ça est nouveau pour moi (et oui, je débute) mais je pense avoir compris le principe, ça n'a pas l'air sorcier, et au moins ça va m'apprendre autre chose, je vous en remercie!

    Du coup, je reviens sur ma 2ème question, si j'enregistre l'instance de ma classe A, tout les objet "MonType" créés et mis dans le vector seront automatiquement sauvegardés?

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonsoir

    Ca ressemble beaucoup à une fabrique ce que tu souhaites : http://come-david.developpez.com/tut...e=Fabrique#LIV

    Pour la sérialisation, il faut fournir les opérateurs << et >> adéquate. Regarde aussi du côté de Boost.Serialize

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut
    Et bien en gros, cette classe servira à stocker tout ce qui devrai être sauvegardé lors de la fermeture du programme (et chargé à l'ouverture...forcement )

    L'idée est donc mettre tout ce que l'utilisateur peut modifier dans cette classe, pour faciliter la sauvegarde (comme ça je n'ai qu'un seul objet à sauvegarder dans un fichier)

  8. #8
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    C'est une très mauvaise idée de vouloir faire une classe "fourre-tout". Il vaut mieux que tu conçoives sans nécessairement penser à la sauvegarde, Seulement après, tu regardes les objets que tu as besoin de sérializer et tu implémentes les méthodes/opérateurs nécessaires pour le faire. Sinon tu obtiendras très vite une énorme classe dégeu et impossible à gérer

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Par défaut
    Salut!

    Oui je suis conscient que dans le fond, cette solution fait assez bourrin mais en même temps je n'aurai pas énormément de chose à stocker dedans...seulement quelques attribut par objets créés à l'intérieur de cette classe (dans le genre 2 strings, une 10ène de int et puis c'est tout. Et juste une méthode Get pour récupérer l'instance que se trouve dans monMap[ID]
    Le reste du programme, ce sera des fenetres, des images etc..bref des trucs qui ne devrons jamais être sauvegardé

    Comme ça, dans le reste du code, je pourrais faire par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(combobox->a_changee())
    {
    ressources->getObjetAtId(combobox->getActual())->charger_reglage();
    // en fait, si je clique sur l'index 5 du combobox, je charge mon reglage n°5
    }
    Demain je vais regarder en détail boost::serialize pour pouvoir stocker cette instance à chaque fermeture du programme pour la ré-ouvrir à chaque ouverture, ça ne parait pas si compliqué en fait et ça me fera découvrir tout ça

Discussions similaires

  1. Ouvrir plusieurs instances d'un même Etat
    Par SansSucre dans le forum IHM
    Réponses: 4
    Dernier message: 06/07/2007, 16h53
  2. Plusieurs instances d'un même objet
    Par speedster dans le forum Hibernate
    Réponses: 1
    Dernier message: 28/12/2006, 11h46
  3. Réponses: 2
    Dernier message: 11/12/2006, 13h15
  4. Problème pour différencier plusieurs select avec le même nom
    Par vallica dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/04/2006, 11h35

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