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

Discussion :

Instanciation d'un objet dans un paramètre de fonction ?

  1. #1
    Invité
    Invité(e)
    Par défaut Instanciation d'un objet dans un paramètre de fonction ?
    Bonjour,
    A la vue de cette discussion : http://www.clubic.com/forum/programmation/creer-variable-dynamique-en-c-id622914-page1.html, je me pose la question si l'on peut avec la classe QVector, instancier une objet dans le ^parmaètre de la fonction push_back, en analogie avec la classe std::vector en c++ ?
    Je peux, par exemple instancier un objet dynamiquement en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int n;
    QVector<maclasse> listobj;
    for (int i=0;i<n;i++)
         listobj.push_back(maclasse); // remplit le premier élément du tableau avec un objet de type ma classe instancié dans le paramètre de la fonction push_back() ???... Ici j'aurais pu utiliser la fonction append()
    ou bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int n;
    QVector<maclasse> listobj;
    for (int i=0;i<n;i++)
         listobj.push_back(new maclasse);
    Je vous demande car cette écriture me choque un peu.
    Dans le cas où c'est possible, pouvez-vous expliquer comment ? Merci d'avance.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 173
    Billets dans le blog
    155
    Par défaut
    Bonjour,

    Je dois dire que cela ne me choque pas.
    Sauf que, si on lit bien le code du deuxième exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int n;
    QVector<maclasse> listobj;
    for (int i=0;i<n;i++)
         listobj.push_back(new maclasse);
    IL y a une faute (que le compilateur sera heureux de vous narguer avec :p)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int n;
    QVector<maclasse*> listobj;
    for (int i=0;i<n;i++)
         listobj.push_back(new maclasse);
    Maintenant, pour ce code avec pointeurs, il faudre penser à libérer les pointeurs :p
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int n;
    QVector<maclasse> listobj;
    for (int i=0;i<n;i++)
         listobj.push_back(maclasse(...) );
    tu remplace les ... par les patametres du constructeur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    ah d'accord je ne savais pas. En fait ici on instancie un objet sans lui donner de nom...
    après chacun fait ce qu'il veut mais personnellement je me sens plus à l'aise avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int n;
    maclasse *obj=new maclasse;
    QVector<maclasse*> listobj;
    for (int i=0;i<n;i++)
         listobj.push_back(obj);
    Je ne sais pas... Pour moi ce code est bien plus clair : on donne un nom à l'objet instancié.
    Instancier des objets sans nom n'est-il pas risqué ?

  5. #5
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Une instance n'est pas un nom mais une adresse mémoire, le nom que tu lui donnes sert juste à être utilisé dans le code, pour être lisible. Mais dans le code de yan ça n'est pas ça qui est important, c'est qu'il déclare des objets sans new, qui sont donc copiés dans le vecteur, et seront automatiquement nettoyés quand le vecteur sera détruit.

    Ce qui n'est pas le cas dans ton code, qui en plus est faux puisque tu ne crées un objet qu'une seule fois et tu vas copier dans ton vecteur la même adresse mémoire à chaque tour de boucle. Il faudrait faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int n=12;
    maclasse *obj;
    QVector<maclasse*> listobj;
    for (int i=0;i<n;i++)
    {
         obj=new maclasse;
         listobj.push_back(obj);
    }
    Mais tu pourrais le faire sans nom, ça serait la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int n=12;
    QVector<maclasse*> listobj;
    for (int i=0;i<n;i++)
         listobj.push_back(new maclasse);
    L'important à retenir c'est qu'en utilisant new, il faudra penser à détruire tous les objets créés, avec delete.

  6. #6
    Invité
    Invité(e)
    Par défaut
    D'accord merci.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pardonnez-moi, mais j'aimerais juste répéter comment je l'ai compris et après j'arrête promis : je reprend le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int n=12;
    maclasse *obj;
    QVector<maclasse*> listobj;
    for (int i=0;i<n;i++)
    {
         obj=new maclasse; // ligne en question
         listobj.push_back(obj);
    }
    Donc si j'ai bien compris, à propos de la création de chaque objet avec new : l'objet est créer sans nom véritable ou bien *obj : le fait qu'il y ait plusieurs objets *.obj n'est pas important : ce qui compte ici c'est l'adresse mémoire qu'on met dans le pointeur obj.
    Et pourtant on n'a pas le droit d'instancier 2 objets de même nom mais là tous les objets de type maclasse sont *.obj (si on peut les appeler comme ça) : j'ai un peu de mal à saisir ça...
    En fait chaque objet crée n'a pas de nom c'est ça ? Il n'est identifié que par son pointeur ?

    En vous remerciant d'avance pour la réponse et en vous souhaitant une bonne journée

  8. #8
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Un "nom" dans le code n'est qu'une étiquette pour le compilateur. Tu n'as pas le droit de déclarer plusieurs variables (int, objet ou n'importe quel type) de même nom car le compilateur ne saurait plus à quoi correspond ce nom. En fait sans que tu le saches, ces noms de variables représentent aussi des emplacements mémoire, mais tout ça est géré par le compilateur.

    Mais ça n'est pas vraiment les objets qui ont un nom. Dans le code que tu cites, tu as une variable obj qui représente une adresse, tu peux modifier ta variable autant que tu veux, elle ne fait que contenir la valeur numérique d'une adresse mémoire. Et cette valeur va bien sûr changer à chaque fois que tu affectes ta variable, donc elle ne contiendra que l'adresse du dernier objet créé.

    Ce que tu dois retenir, c'est qu'à chaque fois que tu fais un new tu dois faire un delete sur l'adresse de l'objet créé. Il ne faut donc pas oublier de faire le delete, et faire attention à ne pas "perdre" l'adresse. Dans ton cas elles sont stockées dans ton vecteur.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci pour la réponse. A bientôt et bonne journée.

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

Discussions similaires

  1. Instanciation automatique des objets dans les formulaires
    Par vincent7894 dans le forum Spring Web
    Réponses: 2
    Dernier message: 21/02/2012, 10h58
  2. Réponses: 2
    Dernier message: 16/11/2009, 11h51
  3. Instanciation d'un objet dans une classe singleton
    Par mulfycrowh dans le forum Débuter
    Réponses: 1
    Dernier message: 16/09/2009, 16h52
  4. Réponses: 4
    Dernier message: 19/06/2007, 11h41
  5. [c#]instanciation d'un objet dans la mainform
    Par fafa139 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 04/06/2006, 23h22

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