Manipulation de tableaux dynamiques

soheib -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'ai une question à propos les tableaux dynamiques.

J'ai un tableau dynamique de type
Exemplaire *
. Il contient des pointeurs comme indiqué dans le code. Je veux afficher les exemplaires ayant une oeuvre spécifiée, sachant qu'oeuvre est un des attributs de la classe
Exemplaire
.

#include <vector>
#include <string>
#include <iostream>

using namespace std;

class Bibliotheque{
    private:
        vector<Exemplaire*> exemplaire;
        string name;
    public:
        Bibliotheque(string testnom):
            name(testnom)
        {
            cout << "La bibliothèque" << name << "est ouverte !" << endl;
        }

        string getNom() {
            return name;
        }

        void stocker(Oeuvre & o) {
            Exemplaire* ex = new Exemplaire(o);
            exemplaire.push_back(ex);
        }

        void stocker(Oeuvre & o, int n) {
            Exemplaire * ex = new Exemplaire(o);
            for (int i = 0; i < n; i++) {
                exemplaire.push_back(ex);
            }
        }

        void lister_exemplaires () {
            for(int i = 0; i < exemplaire.size(); i++) {
                exemplaire[i]->Afficher();
            }
        }

        void lister_exemplaires(Oeuvre & o) {
            int j = 0;
            Exemplaire * ex = new Exemplaire(o);
            for (int i = 0; i < exemplaire.size(); i++) {
                if (exemplaire[i] == *ex) {
                    j = j + 1;
                }
                return j;
                cout << endl;
            }
        }

        ~Bibliotheque() {
            cout << "La bibliothèque " << name << " ferme ses portes, et détruit ses exemplaires :" <<endl;
        }
};

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Plusieurs conseils préalables :
    • soigne l'indentation (cf ton post corrigé)
    • donne un code qu'on peut compiler (ici par exemple il manque les classes
      Exemplaire
      et
      Oeuvre
      )
    • corrige les erreurs de compilation (dans ton message initial, il manquait une accolade).
    • en C++ il y a des conventions de notations : en outre une méthode commence par une minuscule, donc
      Afficher
      devrait devenir
      afficher
      . Dans la même veine il faut choisir comment tu nommes tes méthodes, soit en minuscules avec des
      _
      soit en camel-case. Mais il n'est pas logique d'avoir dans le même code
      getNom
      et
      lister_exemplaires
      , ce sont deux styles de notations différents.
    • Dans la même veine, soit tu fais tout en français, soit tout en anglais. Mais il n'est pas logique d'avoir dans ton code tantôt une variable
      name
      , et tantôt une méthode
      getNom
      .
    • un petit merci ne serait pas de trop :-)
    • ta première méthode
      lister_exemplaires
      devrait être renommée
      afficher_exemplaires
      . Ton attribut de classe
      exemplaire
      devrait être renommé
      exemplaires
      .
    • ta seconde méthode
      lister_exemplaires
      retourne un entier alors qu'elle est supposée ne rien retourner (
      void
      ). D'ailleurs le
      return
      n'est pas au bon endroit et la fonction semble mal nommée (pour le moment ça ressemble plus à
      compter_exemplaires_contenant
      ).
    • enfin ta fonction getNom devrait plutôt être écrite ainsi :


    inline const std::string & get_nom() const {
      return this.nom;
    }


    Et sinon sans le code des classes manquantes, on ne peut pas trop répondre.

    Le plus naturel serait de définir dans
    Exemplaire
    une méthode
    bool contient_oeuvre(const Oeuvre & o)
    et d'adapter dans
    Bibliotheque
    ta fonction
    lister_exemplaires
    .

    Du coup on aurait quelque chose du genre :

    vector<Exemplaire> lister_exemplaires_contenant(Oeuvre & o) {
        vector<Exemplaire> ret;
        for (const Exemplaire & ex : this.exemplaire) {
            if (ex.contient_oeuvre(o)) {
                ret.push_back(ex)
            }
        }
        return ret;
    }


    Bonne chance
    0