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 :

[débutant]Allouer de la mémoire correctement pour un tableau dynamique d'Objets


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut [débutant]Allouer de la mémoire correctement pour un tableau dynamique d'Objets
    Donc, je m'explique :
    J'ai une classe Agenda qui a en attribut privé un tableau de pointeurs qui doit contenir plusieurs instances de la classe RendezVous ("relation simple").
    J'ai également une fonction membre de la classe Agenda dénomée PrendreRendezVous, qui prend en paramètres le jour, le mois, l'année, l'heure, la minute etc... c'est donc dans cette méthode que je souhaite instancier la classe RendezVous puis les stocker dynamiquement dans mon tableau de pointeurs :

    class Agenda
    {
    private:
    RendezVous **mesRdv;
    . public:
    Agenda();
    void PrendreRendezVous(short int jour, short int mois......);
    ~Agenda();
    }

    J'ai cherché un peu partout pour trouver un exemple concrêt avec des objets mais je ne trouve que des allocations mémoire de tableaux de pointeurs de char*...

    Voici ce que j'ai fait, mais je suis quasi-sûr que c'est totallement faux :

    void Agenda:rendreRendezVous(short int jour, short int mois....)
    {
    RendezVous monRdv(jour, mois, annee, heure, minute, duree, objet);
    mesRdv = (RendezVous**)malloc(sizeof(RendezVous));
    .
    .
    .
    }

    Après je coince, je ne sais pas trop comment faire pour allouer de la mémoire pour chaque nouvelle instance de RendezVous et les stocker à la suite dans le tableau...Pourriez vous m'aider à comprendre le principe ??

    Merci d'avance!

    Joseph




    .
    .
    }

  2. #2
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Bouh, les tableaux en **, c'est moche.
    Bouh, le malloc, c'est encore pire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Agenda
    {
    private:
    std::vector<RendezVous *>mesRdv;
    public:
    Agenda();
    void PrendreRendezVous(short int jour, short int mois......);
    ~Agenda();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void Agenda:rendreRendezVous(short int jour, short int mois....)
    {
    RendezVous *monRdv = new RendezVous(jour, mois, annee, heure, minute, duree, objet);
    mesRdv.push_back( monRdv  );
    }
    Ne pas oublier de delete les objets du vector dans le destructor de ta classe agenda.

    Plus d'infos sur la FAQ c++, section stl je crois.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut


    En gros tu souhaites utiliser un tableau de taille non fixe ? Dans ce cas il vaut mieux utiliser les vector, ils sont lpus adaptés à ton cas :

    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
     
    class Agenda
    {
    private:
    std::vector<RendezVous*> mesRdv;
    public:
    Agenda();
    void PrendreRendezVous(short int jour, short int mois......);
    ~Agenda();
    }
     
    void Agenda:rendreRendezVous(short int jour, short int mois....)
    {
    RendezVous* monRdv = new RendezVous(jour, mois, annee, heure, minute, duree, objet);
    mesRdv.push_back(monRdv);
    }

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Bon, tout le monde va te le dire : met ton code entre balises code (le #).

    Sinon, regarde du coté de la STL pour les conteneurs (vector en particulier dans ton cas).

    Et enfin, avant de faire des tableaux de pointeurs sur classe RendezVous (pas tres joli) essaye de bien comprendre toutes les notions associées aux pointeurs. C'est la partie la plus pénible du C, mais une fois integré ça, il n'y a plus de vraie grosse difficulté, et tu pourras faire toutes les classes que tu veux

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    Citation Envoyé par Faiche Voir le message
    Bon, tout le monde va te le dire : met ton code entre balises code (le #).

    Sinon, regarde du coté de la STL pour les conteneurs (vector en particulier dans ton cas).

    Et enfin, avant de faire des tableaux de pointeurs sur classe RendezVous (pas tres joli) essaye de bien comprendre toutes les notions associées aux pointeurs. C'est la partie la plus pénible du C, mais une fois integré ça, il n'y a plus de vraie grosse difficulté, et tu pourras faire toutes les classes que tu veux
    Le problème d'utiliser malloc sur des objets, c'est qu'il n'appelle pas le constructeur de l'objet (entre autre) et free n'appelle pas le destructeur.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 15
    Par défaut
    Heu, mais quelle horreur de faire des malloc avec des objets.
    new et delete pour ca.
    Pour faire une liste, tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<RendezVous *>mesRdv;

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut
    Désolé pour l'oubli des balises CODE, j'en prends compte pour la prochaine fois.
    J'ai songé aux conteneurs, bien que je n'en est jamais utilisé (je débute!), donc voilà une occasion de commencer!
    Pour les tableaux de pointeurs, c'est vrai c'est moche, j'ai bêtement un exemple qu'il m'a été donné dans un cours...

    Merci pour votre aide, je vais tester ça de suite!

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 31
    Par défaut [Résolu]
    Super les conteneurs!!Et dire que je comptais me prendre la tête avec un tableau de pointeurs...
    Merci encore pour vos conseils!

  9. #9
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Pour les conteneurs de pointeurs, n'oublie pas boost, on en parle pas assez alors qu'ils sont vachement pratique : http://www.boost.org/libs/ptr_contai...container.html

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Citation Envoyé par Bakura Voir le message
    Pour les conteneurs de pointeurs, n'oublie pas boost, on en parle pas assez alors qu'ils sont vachement pratique : http://www.boost.org/libs/ptr_contai...container.html
    Uniquement si tu souhaites que ton conteneur prenne l'ownership des objets qu'il contient. Ce qui n'est pas toujours le cas.

  11. #11
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    L'ownership ? Si je comprends bien le mot, c'est à dire avoir la possibilité de les détruire quand tu le souhaites? Je crois qu'il y a des fonctions pour détruire directement un pointeur.

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    C'est plus qu'une possibilité, les vecteurs de pointeurs de boost détruisent le pointeur quand tu le retires du conteneur.

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

Discussions similaires

  1. Formule pour un tableau dynamique
    Par louja dans le forum Excel
    Réponses: 7
    Dernier message: 18/01/2010, 08h55
  2. formule pour un tableau dynamique
    Par louja dans le forum Excel
    Réponses: 1
    Dernier message: 11/01/2010, 08h37
  3. Allouer plus de mémoire pour les mises à jour.
    Par Empty_body dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 14/03/2008, 15h29
  4. [DOM] Pour un tableau dynamique
    Par HanagatAYU dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/02/2008, 11h54
  5. [débutant]ou mettre un fichier java pour une appli jsp?
    Par zozolh2 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 11/05/2004, 15h20

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