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++

  1. #1
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    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 éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    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
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    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

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Bon, je suis à peu près sûr que vous ne compilez pas le code que vous nous indiquez ou que vous oubliez de signaler d'autres erreurs en amont.

    Déjà, vous l'avez défini et implémenter la méthode "nbrRoues" de la classe Garage ? (si vous trouvez cela stupide, relisez la réponse de @Bousk).

  9. #9
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut
    je n'ai pas mis tout le code car j'ai juger de n'afficher que le code concerné par l'erreur mais pour toute fin utile voilà le code complet :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #ifndef VEHICULE_H
    #define VEHICULE_H
    #include <vector>
    using namespace std;
    class Vehicule
    {
        public:
        Vehicule();             ///constructeur par default
        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 Voiture: public Vehicule
    {
    public:
        Voiture(int , int );
        //Construit une voiture dont on fournit le prix et le nombre de portes
        virtual void affiche() const;
        virtual int nbrRoues();
        virtual ~Voiture();
     
        private:
        int m_portes;
     
    };
    class Moto : public Vehicule
    {
        public:
        Moto(int , double );
        //Construit une moto d'un prix donné et ayant une certaine vitesse maximale
        virtual void affiche() const;
        virtual int nbrRoues();
        virtual ~Moto();
     
        private:
        double m_vitesse;
    };
     
    class Garage: public Vehicule
    {
    private:
        vector<Vehicule*> vhcl_garage;
    public:
        Garage();
        void ajouter();
        void supprimer();
        virtual void affiche();
        ~Garage();
    };
    #endif // VEHICULE_H
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include "Vehicule.h"
    #include <iostream>
    #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 !
    {}
     
    Voiture::Voiture(int prix, int portes)
        :Vehicule(prix), m_portes(portes)
    {}
     
    void Voiture::affiche() const
    {
        cout << "Ceci est une voiture avec " << m_portes << " portes et coutant " << m_prix << " euros." << endl;
    }
     
    int Voiture::nbrRoues()
    {
        return 4;
    }
     
    Voiture::~Voiture()
    {}
     
    Moto::Moto(int prix, double vitesseMax)
        :Vehicule(prix), m_vitesse(vitesseMax)
    {}
     
    void Moto::affiche() const
    {
        cout << "Ceci est une moto allant a " << m_vitesse << " km/h et coutant " << m_prix << " euros." << endl;
    }
     
    int Moto::nbrRoues()
    {
        return 2;
    }
     
    Moto::~Moto()
    {}
    Garage::Garage()
    :Vehicule()
    {
    }

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Déjà, vous l'avez défini et implémenter la méthode "nbrRoues" de la classe Garage ?
    Donc non, donc Garage est une classe abstraite, vous ne pouvez donc pas l'instancier.

  11. #11
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut
    C'est la classe Vehicule qui est absraite pas Garage. En plus le main ne contient rien je n'ai pas crée d'instance de la classe Garage. J'ai crée des objets Vehicule, alors qu'elle abstraite, mais ces objets sont des pointeurs. Donc c'est légitime de le faire, ou bien?!

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    C'est la classe Vehicule qui est absraite pas Garage.
    "Garage" dérive de "Vehicule".
    "Vehicule" est une classe abstraite car la méthode "int nbrRoues()" est virtuelle pure.
    Toutes les classes qui dérivent de "Vehicule" et qui ne définissent pas "int nbrRoues()" sont aussi abstraites.
    Donc "Garage" est abstraite.

    En plus le main ne contient rien je n'ai pas crée d'instance de la classe Garage.
    Alors pourquoi le compilateur a besoin d'une vtable de "Garage" ?
    Undefined reference to 'vtable for Garage'
    Donc montrez-nous votre "main" et les messages d'erreurs complets, numéros de ligne compris.

    J'ai crée des objets Vehicule, alors qu'elle abstraite
    Non, vous avez créé des objets donc la classe est une classe fille "Vehicule".
    Pointeur ou pas, cela ne change rien.

    mais ces objets sont des pointeurs.
    Les pointeurs nus que vous utilisez (et les pointeurs nus, c'est pas pour les débutants) ne sont pas des objets, contrairement aux pointeurs intelligents, que je vous conseille chaudement d'utiliser à la place de ces pointeurs nus tout moisis.

  13. #13
    Futur Membre du Club Avatar de EL-jos
    Homme Profil pro
    intelligence artificiel
    Inscrit en
    Mars 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : intelligence artificiel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2017
    Messages : 6
    Points : 9
    Points
    9
    Par défaut
    Salut tout le monde,

    il y a beaucoup des chose à modifier
    1) On utilise jamais un espace de nom(using namespace) dans un fichier .h
    2)L'utilisation de using namespace dans un fichier .cpp déprécier car cela est la cause des conflits de nom des variables
    3)L'utilisation de pointeur nu(*pointeur) est déconseiller à la place utilise un unique_ptr<Vehicule> pointeur
    4)L'utilisation de l'opérateur new est déconseiller, utilise un make_unique
    5)Un garage n'est pas un Vehicule donc revoie ton cours sur l'héritage
    6)Change de livre, trouve toi un livre sur C++ moderne car ton code c'est juste du C avec des classes( C with class )
    Merci pour la compréhension

+ 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