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 :

Tableau dynamique de classe


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    En recherche d’emploi
    Inscrit en
    Février 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : En recherche d’emploi

    Informations forums :
    Inscription : Février 2014
    Messages : 62
    Points : 36
    Points
    36
    Par défaut Tableau dynamique de classe
    Bonjour,

    Je dois faire un programme avec des tableaux dynamiques sans utiliser de vector.

    J'ai une classe Entree avec deux attributs : nom, numéro.
    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 Entree{
        public :
        // Constructeur 
        Entree();
        Entree(std::string nom, std::string numero);
     
        // Méthodes d'accès
        void setNom(std::string nom);
        void setNumero(std::string numero);
     
        private :
        int m_nom;
        int m_numero;
    }
    Une classe Tableau avec un attribut Entree qui est un pointeur.
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    // Tableau.h
    class Tableau{
        public :
        // Constructeur avec valeur par défaut
        Tableau(int taille=100);
     
        // Destructeur
        ~Tableau();
     
        // Methods
        void ajouter(std::string nom, std::string numero);
     
        private :
        int m_taille;
        int m_indice;
        Entree *m_entree;
    }
     
    -------------------------------------------------------------------------------
     
    // Tableau.cpp
    Tableau::Tableau(int taille) : m_taille(taille), m_indice(0), m_entree(0){
        m_entree = new Entree[taille];
    }
     
    void Tableau::ajouter(string nom, string numero){
        m_entree[m_indice].setNom(nom);
        m_entree[m_indice].setNumero(numéro);
        m_indice++;
    }
     
    Tableau::~Tableau(){
        delete [] m_entree;
    }
    J'ai normalement bien fait mes allocations dynamiques seulement à l'exécution la fonction ajouter donne core dumped.
    Je comprends pas ou se trouve le problème.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Si tu ajoutes plus d'éléments que ne peux contenir ton tableau, ça va seg fault.

    (Et le ctor par copie par défaut de Tableau n'est pas suffisant. Tu devrais utiliser std::vector ici.)

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    En recherche d’emploi
    Inscrit en
    Février 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : En recherche d’emploi

    Informations forums :
    Inscription : Février 2014
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    Salut,

    Peut-être que c'est moi qui ne comprends pas l'énoncé et qu'il faut utiliser un vector? Ici je n'ai pas mis le code pour les affichages

    Ennoncé :
    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
    17
    18
    
    Une entrée contient un nom et son numéro de téléphone. Une entrée peut être affichée.
    
    Un tableau contient un tableau dynamique d’entrées. 
    On peut ajouter/supprimer une entrée en donnant un nom et son numéro de téléphone. On peut également supprimer les entrées correspondant à un nom. Un tableau peut être affiché.
    
    1. Donner la spécification et le code de la classe Entrée (Entree.h et Entree.cpp).
    - Variables :
    
    • Nom (string)
    • Numéro de téléphone (string)
    - Méthodes :
    • Son constructeur
    • une méthode d'affichage
    2. Donner la spécification et le code de la classe Tableau (Tableau.h et Tableau.cpp). - Variables :
    • taille totale du tableau
    • Pointeur vers la classe Entree
    • Nombre d'éléments
    - Méthodes :
    • Constructeur
    • Destructeur
    • Constructeur par copie
    • une méthode d'affichage
    • ajouter : Ajoute un Nom et un numéro de téléphone - supprimer : Prend un nom et un numéro en paramètre - supprimer : Prend un nom en paramètre
    • méthodes d'accès en lecture sur nbelem et taille
    Pour la class Entrée c'est assez simple alors je pense que c'est bon c'est seulement au niveau du tableau.

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Le plantage pourrait venir des fonctions setNom() et setNumero() dont le corprs n'est pas indiqué, d'autant que recevant des string alors que les champs d'Entree sont des int!

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Déjà, setNom et setNumero sont inutiles : une fois que le nom et le numéro de téléphone de ton entrée ont été définis (au travers du constructeur), il n'y a plus de raison de les modifier Par contre:
    • vu que tu veux pouvoir récupérer le nom de l'entrée (entre autres pour la supprimer de ton tableau), un accesseur (getNom) pourrait s'avérer utile
    • vu que tu veux pouvoir afficher ton entrée, un opérateur << sur un flux de sortie déclaré comme ami de ta classe Entree sera sans doute intéressant


    (NOTA: tu auras surement remarqué, au passage, que ton prof n'a effectivement pas demandé de fonction pour modifier le nom et le numéro de téléphone )

    Pour ce qui est de la classe Tableau, il faudra quand même taper sur les doigts de ton prof et lui dire que, s'il te demande (à juste titre) de définir le destructeur (et le constructeur de copie), il serait bon de respecter la grande règle des trois en te demandant également de fournir un opérateur d'affectation!

    D'ailleurs, bien que ce ne soit pas demandé dans l'énoncé, fournir une fonction swap qui permet d'intervertir le contenu de deux tableaux s'avérerait particulièrement intéressant afin d'être en mesure d'utiliser l'idiome "copy and swap" au niveau de l'opérateur d'affectation

    Enfin, il y a deux possibilités à prendre en compte lors de l'ajout d'une nouvelle entrée : soit ton tableau est "assez grand" que pour contenir l'entrée supplémentaire, et tout se passe alors pour le mieux dans le meilleur des mondes, soit il est "déjà rempli" et il n'y a plus assez de place pour y rajouter la nouvelle entrée.

    Dans le deuxième cas, ou bien tu dois refuser de créer l'entrée (ce qui serait dommage, vu qu'on te demande de faire quelque chose de dynamique), ou bien tu dois veiller à ... agrandir le tableau pour qu'il dispose d'assez de place que pour accepter l'entrée supplémentaire. On peut présumer que ton prof souhaite que tu choisisse cette option . A toi de voir comment t'y prendre pour y arriver
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    En recherche d’emploi
    Inscrit en
    Février 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : En recherche d’emploi

    Informations forums :
    Inscription : Février 2014
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    Salut,

    Le plantage pourrait venir des fonctions setNom() et setNumero() dont le corprs n'est pas indiqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        // Méthodes d'accès
        void setNom(std::string nom);
        void setNumero(std::string numero);
    d'autant que recevant des string alors que les champs d'Entree sont des int!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Entree(std::string nom, std::string numero);
    J'ai trouver une solution pour éviter de mettre des setters, j'ai changé le code du constructeur Entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Entree(std::string nom="", std::string numero="");    // Constructeur par défaut
    et le code de la méthode ajouter dans la class Tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Tableau::ajouter(string nom, string numero){
        Entree e(nom, numéro);
        m_entree[m_indice++] = e;
    }
    Ce n'est peut-être pas la meilleure solution mais j'essaie de le faire par rapport à l'énoncé de l'exo et ça fonctionne.

    Merci de votre aide.

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    En recherche d’emploi
    Inscrit en
    Février 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : En recherche d’emploi

    Informations forums :
    Inscription : Février 2014
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    Salut koala01,

    Je n'avais pas vu ton post avant d'envoyé le mien.
    Je tiendrai compte de tes super explications merci.

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

Discussions similaires

  1. Tableau dynamique deux dimensions de class
    Par Hyssgrif dans le forum C++
    Réponses: 3
    Dernier message: 17/04/2015, 15h22
  2. Réponses: 3
    Dernier message: 23/03/2015, 11h12
  3. Réponses: 20
    Dernier message: 06/02/2013, 00h17
  4. Classe et tableau dynamique
    Par coberle dans le forum C++
    Réponses: 4
    Dernier message: 25/09/2008, 16h44
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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