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 ?

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 129
    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 129
    Billets dans le blog
    149
    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 : 39
    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.

+ 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, 09h58
  2. Réponses: 2
    Dernier message: 16/11/2009, 10h51
  3. Instanciation d'un objet dans une classe singleton
    Par mulfycrowh dans le forum Débuter
    Réponses: 1
    Dernier message: 16/09/2009, 15h52
  4. Réponses: 4
    Dernier message: 19/06/2007, 10h41
  5. [c#]instanciation d'un objet dans la mainform
    Par fafa139 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 04/06/2006, 22h22

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