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 :

Erreur : conversion from 'std::vector<Vehicule*>*' to non-scalar type 'std::vector<Vehicule*>' requested


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Par défaut Erreur : conversion from 'std::vector<Vehicule*>*' to non-scalar type 'std::vector<Vehicule*>' requested
    je travail sur un exercice qui gère les véhicules d'un garage. J'ai une classe Vehicule et une classe Garage leurs prototype .h est :
    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 VEHICULE_H
    #define VEHICULE_H
    #include <vector>
    using namespace std;
    class Vehicule
    {
        public:
        Vehicule();
        Vehicule(int );           //Construit un véhicule d'un certain prix
        virtual void affiche() const;
        virtual int nbrRoues()=0;
        virtual ~Vehicule();          //Remarquez le 'virtual' ici
     
        protected:
        int m_prix;
    };
    class Garage: public Vehicule
    {
    private:
        vector<Vehicule*> vhcl_garage;
    public:
        Garage();
        void ajouter();
        void supprimer();
        virtual void affiche();
        ~Garage();
    };
    #endif // VEHICULE_H
    l'erreur est indiqué dans le fichier.cpp qui est comme suit :
    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
    #include "Vehicule.h"
    #include <iostream>
    #include <cstdlib>
    #include <vector>
    using namespace std;
     
    Vehicule::Vehicule()
    {}
    Vehicule::Vehicule(int prix)
        :m_prix(prix)
    {}
     
    void Vehicule::affiche() const
    //J'en profite pour modifier un peu les fonctions d'affichage
    {
        cout << "Ceci est un vehicule coutant " << m_prix << " euros." << endl;
    }
     
    Vehicule::~Vehicule() //Même si le destructeur ne fait rien, on doit le mettre !
    {}
    Garage::Garage()
    :Vehicule()
    {
        std::vector<Vehicule>* vhcl_garage=new std::vector<Vehicule>;
    }
    Je voudrais savoir où est le problème ?!

  2. #2
    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,

    Attention, std::vector<Vehicule*>, ca correspond à un tableau de pointeurs sur véhicules; std::vector<Vehicule>* ca correspond à un pointeur sur un tableau de véhicules, ce n'est pas du tout pareil!

    Dans le premier cas, tu dois créer tes véhicules en ayant recours à l'allocation dynamique de la mémoire, mais le tableau est dans la pile de ta classe, dans le second cas, c'est le tableau que tu crées en ayant recours à l'allocation dynamique de la mémoire, mais tu crées "normalement" les véhicules qu'ils contient...

    De plus, même en déclarant vhcl_garage comme étant un std::vector<Vehicule> * le code de ton constructeur serait faux, car, lorsque tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Garage::Garage()
    :Vehicule()
    {
        std::vector<Vehicule>* vhcl_garage=new std::vector<Vehicule>;
    }
    tu déclares, à l'intérieur de ton constructeur, une variable locale (à ton construteur) qui s'appelle vhcl_garage et qui, pas de bol, va cacher durant toute la durée de l'exécution du constructeur la donnée membre qui porte le même nom.

    Mais le résultat, c'est que toutes les actions qui pourraient être entreprises au niveau du constructeurs seront entreprises sur la variable locale, et que la donnée membre de ta classe ne serait en aucun cas affectée par ces modifications.

    Si donc, tu déclare la donnée membre de ton garage comme étant std::vector<Vehicule> * vhcl_garage (ce que je te déconseille), ton constructeur devrait plutôt ressembler à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Garage::Garage()
    :Vehicule()
    {
        /* nul besoin de DECLARER une variable ici, vu qu'on a déjà une donnée membre
         * qui fait l'affaire... il suffit de DEFINIR une valeur correcte pour cette variable
         */
        vhcl_garage=new std::vector<Vehicule>;
    }
    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

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    Par défaut
    Citation Envoyé par koala01 Voir le message
    comme étant std::vector<Vehicule> * vhcl_garage (ce que je te déconseille)
    C'est plutôt quel est l'utilité de déclarer un pointeur d'un tableau dynamique ?


    Citation Envoyé par koala01 Voir le message
    ton constructeur devrait plutôt ressembler à quelque chose comme
    Ou bien, si ton attribut est un pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Garage::Garage()
    :Vehicule(), vhcl_garage(new std::vector<Vehicule>())
    {
    // ...
    }

  4. #4
    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
    Y'a déjà un autre problème qui saute aux yeux : class Garage: public Vehicule, cet héritage n'a absolument aucun sens.
    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.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Par défaut
    Citation Envoyé par foetus Voir le message
    C'est plutôt quel est l'utilité de déclarer un pointeur d'un tableau dynamique ?
    c'était juste une faute de frappe. mon attribut est justement comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<Vehicule*> vhcl_garage;
    il n'est pas de cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Vehicule> * vhcl_garage
    donc correction pour mon code il est comme suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Garage::Garage()
    :Vehicule()
    {
        vector<Vehicule*>vhcl_garage=new std::vector<Vehicule*>;
    }
    je ne sais pas pourquoi il m'indique l'erreur déjà cité en haut?!

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    je ne sais pas pourquoi il m'indique l'erreur déjà cité en haut?!
    Vous n'avez absolument compris les réponses de mes voisins du dessus.
    Supprimez la ligne car elle ne sert à rien et elle est fausse.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Par défaut
    oui je l'ai supprimer et elle m'indique deux erreurs :
    Undefined reference to 'vtable for Garage'
    error: ld returned 1 exit status

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/02/2017, 17h38
  2. conversion to non-scalar type requested !
    Par gilouu dans le forum C++
    Réponses: 8
    Dernier message: 19/11/2009, 21h07
  3. erreur conversion from to non scalar requested
    Par annesophiedecar dans le forum Langage
    Réponses: 2
    Dernier message: 15/10/2009, 23h16
  4. conversion to non-scalar type requested
    Par jbarreau-mainson dans le forum C
    Réponses: 15
    Dernier message: 03/04/2009, 12h58
  5. Réponses: 1
    Dernier message: 04/10/2006, 09h01

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