Manipulation de tableaux dynamiques

-
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;
        }
};
Afficher la suite 

1 réponse

Messages postés
28956
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 août 2019
6621
0
Merci
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
Commenter la réponse de mamiemando