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 :

[POO]construction plusieurs objets même préfixe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [POO]construction plusieurs objets même préfixe
    Bonjour,
    Je sais que je vais me faire huer et tirer les oreilles mais j'ai un doute quand je crée des objets avec une boucle for : je veux créer 4 objets par exemple (en fait ce nombre peut varier) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    n=4;
    for (int i=0;i<n;i++)
    {
         Bibi* obj_i=new Bibi(parent);
    }
    Est-ce que le programme va crée les objets pointés : *obj_0, *obj_1, *obj_2 et *obj_3 ?
    Objets qui dureront tant qu'ils ne meurent pas avec delete.
    Merci car j'ai un petit doute : je n'ai pas le souvenir dans mes cours de c++ d'avoir fait une telle chose.

  2. #2
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Bonjour,

    Ce que tu proposes ne fonctionne pas, par contre tu peux trouver un moyen de concaténer un string qui aurait pour valeur "obj_" avec un int



  3. #3
    Membre expérimenté Avatar de Dalini71
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 181
    Par défaut
    Le problème ici c'est que les objets crées dans la boucle meurent avec elle (leur portée est délimitée par les accolades ouvrantes et fermantes).

    si tu veux toujours passer par des boucles tu peux employer cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::Vector<Bibi*> v;
     
    for (unsigned int i = 0; i < n; ++i) {
         Bibi* obj_i=new Bibi(parent);
         v.push_back (obj_i);
    }
    De cette façon tu pourras toujours accéder a tes objets grâce aux pointeurs stockes dans le vector.

  4. #4
    Invité
    Invité(e)
    Par défaut
    pourtant on m'a dit qu'en faisant new cela permettit de contrôler la durée de vie de l'objet : donc qu'il soit à l'intérieur de la boucle for n'a pas d'incidence non ? je ne comprend pas.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    En fait tu vas créer dans chaque itération de la boucle deux nouveaux objets :
    - Un objet de type Bibi, alloué dynamiquement
    - Un objet de type Bibi*, nommé obj_i (et pas obj_1...), alloué sur la pile, et qui pointe sur le premier objet.

    A la fin de chaque itération, l'objet obj_i sera détruit (mais pas l'objet de type Bibi sans nom, d'ailleurs, comme plus personne ne connaît cet objet dans le code, personne ne pourra jamais faire delete dessus : Tu as une fuite mémoire).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre expérimenté Avatar de Dalini71
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 181
    Par défaut
    Tu fais un new donc ton objet est créé en mémoire, et le new te renvoie un pointeur sur cette zone mémoire, te permettant donc de la modifier. Ce qu'il faut bien comprendre c'est que le pointeur renvoyé par new est le seul moyen d'accès que tu as sur ton objet alloué, sans lui te ne peut même plus le delete.

    Toi dans ta boucle, tu fais bien le new, tu récupère le résultat dans un pointeur, mais seulement ce pointeur est détruit des que tu sors de la boucle. Par conséquent ton objet est bien créé, mais tu n'as plus de moyens d'y accéder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i = 0; i < 10; ++i)
    {
      int a = 2;
      // Blablabla...
    }
    a = 3; // Faux ! a n'existe plus ici
    Edit: Grillé pas JolyLoic ><

  7. #7
    Invité
    Invité(e)
    Par défaut
    Les fuites de mémoire c'est pas bon ça... Je vais tenter un autre truc alors. En fait j'ai posté le topic car les résultats du débogueur m'a fait vachement douter : et vous n'avez que confirmer les dires du débogueur.

    Un tout dernier truc : Quand je crée le pointeur obj_i, le i ne prendra jamais les valeurs 0,1,2,3 car il est considéré comme caractère alphanumérique partie intégrante du nom du pointeur c'est ça ?
    Merci bonne soirée.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/04/2010, 12h45
  2. Supprimer plusieurs tables avec le même préfixe
    Par laurentSc dans le forum Administration
    Réponses: 5
    Dernier message: 26/11/2008, 21h30
  3. m3g : utilisation de plusieurs objets en même temps
    Par chabfive dans le forum Développement Mobile en Java
    Réponses: 1
    Dernier message: 23/06/2006, 14h00
  4. [POO] Détruire un objet pendant sa construction
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 23/05/2006, 11h00
  5. [POO] Conserver un objet PHP 5 entre plusieurs pages
    Par Invité dans le forum Langage
    Réponses: 24
    Dernier message: 20/05/2006, 14h13

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