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 :

Retour de fonction // tableau // POO


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    noob programmeur
    Inscrit en
    Janvier 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : noob programmeur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2017
    Messages : 7
    Par défaut Retour de fonction // tableau // POO
    Bonjour!

    Je suis en train de coder un petit programme de gestion d'une bibliothèque.

    Ma class Bibliothèque contient un tableau d'objets Ouvrage : listeOuvrages

    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
     
    #ifndef _BIBLIOTHEQUE_
    #define _BIBLIOTHEQUE_
    /**********************************************/
     
    #include <vector>
    #include "Ouvrage.h"
    #include "Abonne.h"
     
    class Bibliotheque{
    private:
    	std::vector<Ouvrage*> listeOuvrages;                   //
    	std::vector<Abonne*> listeAbonnes;
    public:
     
    	Bibliotheque();
    	void ajoutOuvrage(Ouvrage *ouvrage);			
    	Ouvrage getOuvrage(std::string titre);			//
    	void ajoutAbonne(Abonne *abonne);
    	Abonne getAbonne (int id) const ;
    	void Emprunter(std::string titre, int id);
    	void rendre(int id);
    	void info() /*const*/ ;
    	~Bibliotheque();
    };
     
    /**********************************************/
    #endif
    ma class Bibliothèque contient une méthode getOuvrage qui prend en argument un titre d'ouvrage et qui renvoie l'ouvrage correspondant s'il existe:

    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
     
    Ouvrage Bibliotheque::getOuvrage(std::string titre){
    		if (listeOuvrages.size() == 0){
    			std::cout << "Il n'y a aucun ouvrage dans la bibliothèque." << std::endl;
    			// QUE PUIS-JE RETOURNER?
    		}
    		else{
    			for (int i=0; i<listeOuvrages.size();i++){
    				if (listeOuvrages[i]->getTitre() == titre){
    					std::cout << "Ouvrage envoyé." << std::endl;
    					return *listeOuvrages[i];
    				}
    				else{
    					std::cout << "L'ouvrage n'est pas dans la bibliothèque." << std::endl;
    					// QUE PUIS-JE RETOURNER?
    				}
    			}
    		}
    	}
    Cette méthode doit renvoyer un objet ouvrage.
    Lorsque mon tableau d'Ouvrages contient au moins 1 élément qui correspond à la demande, la méthode fonctionne parfaitement.
    Mais quand le tableau est vide ou alors que l'Ovrage demandé n'est pas dans le tableau d'Ouvrages qu'est ce que je peux retourner? (Dans le code ci-dessus, se référer au commentaire QUE PUIS-JE RETOURNER?)

    Merci beaucoup par avance pour votre aide

    Letthieum

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Il y a 2 façon de faire

    À la C: tu changes la signature de ta méthode pour prendre en paramètre 1 ouvrage et retourner 1 booléen.
    Tu peux avoir 1 paramètre sortie soit 1 référence/ pointeur sur 1 ouvrage soit 1 ouvrage soit 1 index d'1 ouvrage dans la bibliothèque.

    Le retour: true si l'ouvrage a été trouvé, false sinon.
    Si la méthode te retourne false tu sais que le paramètre ouvrage n'est pas valide.
    Ainsi tu peux mettre l'appel dans 1 test if ( getOuvrage(...) ) { /* traitement de l'ouvrage */ } else { /* gestion qu'il manque l'ouvrage */ }.

    À la C++: il faut créer 1 méthode is_valid() dans ta classe ouvrage.
    Cette méthode va tester tous les attributs de ta classe, en théorie, tester avec les valeurs d'initialisation.
    L'idée, c'est de retourner 1 ouvrage vide (juste initialisé) en cas de bibliothèque vide ou d'ouvrage non trouvé.
    Pour les chaînes de caractères std::string, tu as la méthode std::string::empty.

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Le plus simple est de retourner un pointeur vers l'ouvrage et nullptr si aucun n'est trouvé. Mais quelques remarques en vrac sur le code:

    - Le paramètre titre devrait en const& ou mieux encore, un std::string_view.
    - Une boucle sur intervalle serait beaucoup mieux qu'une boucle basée sur des indices.
    - _BIBLIOTHEQUE_ est un mot réservé, comme tous les identifiants qui commencent par _ suivit d'une majuscule: https://en.cppreference.com/w/c/lang...ed_identifiers
    - Les pointeurs dans les tableaux listeOuvrages et listeAbonnes sont une erreur. Soit il n'y a pas besoin de pointeur, soit il te faut utiliser un pointeur intelligent (std::unique_ptr).
    - La recherche est de complexité linéaire. Ce n'est pas grave sur des petites entrées, mais dans le cas général, une hashmap fait mieux l'affaire (std::unordered_map).
    - Ce n'est pas aux fonctions de recherche de faire l'affichage de texte, cela devrait se faire à l'extérieur par l'appelant (single-responsability principe).

  4. #4
    Membre régulier
    Homme Profil pro
    noob programmeur
    Inscrit en
    Janvier 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : noob programmeur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2017
    Messages : 7
    Par défaut
    Bonjour Foetus, bonjour jo_link_noir,

    Merci infiniment pour le temps que vous avez consacré à me prodiguer vos conseils !

    Je vais tester / me familiariser avec tout ça


  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    A partir de C++17, la bonne solution est renvoyer un std::optional<Ouvrage>. Voir https://en.cppreference.com/w/cpp/utility/optional

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/03/2018, 11h01
  2. Retour d'une fonction en POO
    Par andaman dans le forum Langage
    Réponses: 6
    Dernier message: 15/10/2013, 18h58
  3. Tableau en retour de fonction
    Par Nicolus dans le forum PL/SQL
    Réponses: 4
    Dernier message: 03/02/2011, 17h16
  4. retour d'un tableau dans une fonction
    Par FlyByck dans le forum Delphi
    Réponses: 3
    Dernier message: 19/01/2007, 00h00
  5. [syntaxe] tableau et retour de fonction
    Par BainE dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2005, 16h01

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