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

Langage C++ Discussion :

Créer une fonction qui renvoie un vecteur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Par défaut Créer une fonction qui renvoie un vecteur
    Bonjour,

    J'essaye en vain de faire un accesseur pour un vecteur d'une classe. J'ai fait des accesseurs pour tous les attributs de ma classe mais je n'arrive pas à faire celui du vecteur. J'utilise Qt mais à prioris ça n'a pas d'incidence sur mon problème. Je précise que j'ai cherché déjà plein d'exemples sur le net et qu'ils ne marchent pas chez moi, inutile de m'accabler de reproches.

    voici la déclaration dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector<QString> genres[5];
     
    const std::vector<QString> &getGenres();
    et dans le .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::vector<QString>& Film::getGenres()
    {
        return genres;
    }
    C'est la copie conforme d'un des exemples que j'ai trouvé mais il me renvoie l'erreur: invalid initialization of reference of type 'const std::vector<QString>&' from expression of type 'const std::vector<QString>*'
    Au passage, est-ce que vous pouvez me donner le code pour faire un Set pour modifier les valeurs du vecteurs?
    Merci d'avance.

    Cordialement

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<QString> genres[5];
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<QString> genres;
    Le deuxième est un tableau (taille dynamique) de QString.
    Le premier est un tableau (taille fixe à 5) de tableau (taille dynamique) de QString.

    Si ta méthode ne modifie pas l'objet, tu "dois" l'indiquer :
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::vector<QString> &getGenres()
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<QString> const & getGenres() const
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::vector<QString> &getGenres()
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<QString> const & Film::getGenres() const
    PS: Utilise la balise [CODE]

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Maintenant que l'on t'a donné la solution, je tiens quand meme à insister sur le fait que, à mon sens, tu ne devrais pas prévoir un accesseur sur ton vecteur de Qstring, pas plus que tu ne devrais prévoir un mutateur (que je subodore que tu as aussi prévu) d'ailleurs!

    Ce que tu aurais très largement intérêt à faire, c'est de réfléchir aux services que tu es en droit d'attendre de la part des ta classes qui sont en rapport avec la présence de ce tableau.

    Car il existe une règle érigée en loi qui s'appelle la loi de Déméter qui nous dit que, si un objet de type A (ta classe Film) utilise en interne un objet de type B(le std::vector<QString>), l'utilisateur de la classe A (la classe Film) ne devrait pas avoir à connaître la classe B pour pouvoir utiliser son objet de type A.

    C'est encore plus vrai pour tout ce qui a trait aux conteneurs : Typiquement, il ne devraient servir qu'au maintient en interne des données utilisées par la ta classes
    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

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Rien n'empêche, par contre, de prévoir un itérateur... si c'est dans le sens réel de la classe. (en ce cas, prévoir a la fois begin() et end(), et un ++)

    L'itérateur masque le vecteur, sans cacher la sémantique de collection de genres.

  5. #5
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    Citation Envoyé par leternel Voir le message
    L'itérateur masque le vecteur, sans cacher la sémantique de collection de genres.
    Excusez moi, mais en quoi l'iterateur masquerait-il le vecteur ? Pour appeler un iterateur, on est obliger de specifier son conteneur non ? (à part peut être pour le c++11 avec auto ?)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Non parce que tu itères sur les objets contenus dans la collection, quelle que soit la colletion.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 24/03/2010, 14h01
  2. Comment faire une fonction qui renvoi un tableau.
    Par poly128 dans le forum Delphi
    Réponses: 2
    Dernier message: 01/06/2006, 01h04
  3. Réponses: 12
    Dernier message: 23/03/2006, 14h13
  4. [9i] PLS-00320 avec une fonction qui renvoi un curseur
    Par hoaxpunk dans le forum Oracle
    Réponses: 5
    Dernier message: 09/02/2006, 17h04
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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