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 :

Vector et classe


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Points : 39
    Points
    39
    Par défaut Vector et classe
    Bonjour,
    Alors voila mon probleme j'ai une classe B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class B:
    {
         String id;
       public:
         B(String _id) : id(_id) {};
    };
    et une classe A
    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
     
    class A:
    {
         std:vector<B> vB;
       public:
         A();
         A(const A& a);
         std::vector<B> & getVector();
    };
     
    A::A () : vb(0) {}
    A::A(const A & a) 
    {
    vb(a.getVector().size());
    vb = a.getVector();
    }
     
    std::vector<B> & getVector()
    {
    return vb;
    }
    Mon soucis est pour l'initialisation des vecteur dans le constructeur par defaut j'ai un message :
    no matching function for call to ‘B::B()’
    Et mon constructeur par recopie a aussi des problèmes
    - passing ‘const A’ as ‘this’ argument of ‘std::vector<B>& A::getVector()’
    discards qualifiers [-fpermissive]
    Voila, toute aide est la bienvenue, j'espère avoir été clair.
    Merci

  2. #2
    Membre habitué Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Points : 154
    Points
    154
    Par défaut
    Oui, il y a plusieurs problèmes.

    Saches déjà que quand tu codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vb(a.getVector().size());
    tu demandes à créer un vecteur d'une certaine taille N qui contiendra N éléments B initialisés par défaut. Ce n'est donc possible que si ta classe B a un constructeur par défaut. Or la tienne n'en a pas. Tu as 2 solutions :
    1. Ajouter un constructeur vide :
    2. Mettre un argument par défaut à ton constructeur qui initialise avec la chaine vide par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    B(String _id = "") : id(_id) {};
    Ensuite il me semble que pour ton constructeur par copie, tu t'embêtes pour rien. Utilises assign Pas besoin de passer la taille etc..
    Si tu as 2 vecteurs std::vector<int> vi1 et std::vector<int> vi2 déjà remplis, vi1 de taille 100 et vi2 de taille 50 par exemple, alors tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vi1.assign(vi2.begin(),vi2.end());
    Tu copieras le contenu de vi2 dans vi1, pas besoin de se soucier de la taille.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Points : 39
    Points
    39
    Par défaut
    Merci pour ta réponse,
    J'ai toujours un problème avec mon constructeur par recopie, j'ai l'impression que mon getVector ne me renvoie pas le vector

    j'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    A::A(const A & a)
    {
    vb.assign(a.getVector().begin(), a.getVector().end() );
    }
    le message d'erreur commence par : passing ‘const

    J'ai donc modifier ma fonction getVector par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::Vector<B> &A::getVector() const;
    Je pensais que en appelant getVector sur un objet const dans le constructeur par recopie aller poser des problèmes donc j'ai mis la fonction en const pour signaler qu'elle ne modifiait rien.
    Seulement maintenant j'ai un message d'erreur dans la fonction getVector :
    invalid initialization of reference of type ‘std::vector<B>&’ from expression of type ‘const
    std::vector<B>’
    Mon raisonnement est sûrement faux, ou j'ai fais une faute d’inattention.
    En tout cas merci pour ta précédente réponse

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tu dois renvoyer une référence constante sur ton vecteur dans ta méthode getVector() . (et en passant y a t'il une raison pour qu'une telle fonction existe?) Pour ton constructeur, tu peux directement utiliser la liste d'initialisation + le fait que la visibilité private concerne les classes et non pas les instances:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A(A const& other):vB(other.vB) {}

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Plusieurs remarques :

    1. B(String _id) : id(_id) {} : Attention au nom commençant par _ => à éviter. Cf F.A.Q. : Quels sont les identificateurs interdits par la norme ?
    2. Comme dit ci-dessus, préfère les listes d'initialisation : F.A.Q. Mes constructeurs doivent-ils utiliser les listes d'initialisation ou l'affectation ?
    3. Inutile de définir une constructeur de copie. Le compilateur va en générer un automatiquement et celui-ci devrait être suffisant au regard de ta classe. F.A.Q. : Quand dois-je définir un constructeur par copie ?
    4. Certes getVector doit être constant, mais il devrait aussi retourner une référence constante : std::Vector<B> const & getVector() const;
    5. Mais en fait, il est fortement déconseillé de pourvoir sa classe d'accesseur/mutateur 'brut'. Ils brisent l'encapsulation et exposent des détails d'implémentation.
    6. question de style donc complètement discutable : je préfère d'abord mettre les membres publiques dans une classe puis terminer par les parties privées. Cela permet d'avoir dès le début de lecture de la classe son interface publique.


    Au final, ta classe peut être drastiquement réduite :
    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
    #include <string>
    class B
    {
       public:
         B(std::string id_) : id(id_) {}
     
       private:
         std::string id;
     
    };
     
     
    #include <vector>
    class A
    {
       public:
         A();
       private:
         std::vector<B> vb;
    };
     
    A::A ():vb() {}
     
    int main()
    {
        A a1;
        A a2;
     
        a2 = a1;
        return 0;
    }

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

Discussions similaires

  1. Vector et classes abstraites
    Par vbaddict44 dans le forum C++
    Réponses: 11
    Dernier message: 17/07/2012, 16h18
  2. vector de classe templatée
    Par Lintel-oo dans le forum Langage
    Réponses: 3
    Dernier message: 29/04/2012, 16h59
  3. vector de classe
    Par Invité dans le forum SL & STL
    Réponses: 10
    Dernier message: 23/11/2008, 16h20
  4. Problème avec vector de classe template :(
    Par coyotte507 dans le forum Langage
    Réponses: 7
    Dernier message: 16/04/2008, 12h40
  5. [CONCEPTION] vector de classes heritées
    Par A-S-H dans le forum SL & STL
    Réponses: 9
    Dernier message: 28/12/2005, 09h50

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