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 :

Héritage - erreur de segmentation


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 30
    Points : 30
    Points
    30
    Par défaut Héritage - erreur de segmentation
    Bonjour,

    le code suivant compile, mais à l'exécution j'ai une erreur de segmentation... et je comprends vraiment pas pourquoi.

    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
    58
    59
    60
     
    #include <iostream>
    #include <string>
     
    class Voiture
    {
    public:
    	Voiture () {}
    	virtual ~Voiture () {}
     
    	virtual std::string getMarque () {}
    };
     
    class Porsche : public Voiture
    {
    public:
    	Porsche () {}
    	~Porsche () {}
     
    	std::string getMarque () {return "Porsche";}
    };
     
    class VoitureConteneur
    {
    public:
    	VoitureConteneur () {voit = Voiture();}
    	VoitureConteneur (Voiture _voit) {voit = _voit;}
    	~VoitureConteneur () {}
     
    	Voiture getVoiture () const {return voit;}
    	void setVoiture (Voiture _voit) {voit = _voit;}
     
    private:
    	Voiture voit;
    };
     
    class Donner2Voitures
    {
    public:
    	static VoitureConteneur * getVoitures ()
    	{
    		Porsche * p1 = new Porsche();
    		Porsche * p2 = new Porsche();
     
    		VoitureConteneur * toReturn = new VoitureConteneur[2];
    		toReturn[0].setVoiture(*p1);
    		toReturn[1].setVoiture(*p2);
    		delete p1;
    		delete p2; // avec ou sans les delete c'est pareil
    		return toReturn;
    	}
    };
     
    int main ()
    {
    	VoitureConteneur * mesVoitures = Donner2Voitures::getVoitures();
    	std::string marque = (mesVoitures[0].getVoiture()).getMarque(); // ligne foireuse
     
    	return 0;
    }
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    tu fais des copies à tout va, stocke les variables en elle-même...

    autant de points qui interdisent l'utilisation de la polymorphie...

    et comme la fonction getMarque de Voiture ne renvoie rien, tu te retrouve facilement avec des segfault

    pour voir les points qui posent problèmes, modifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	virtual std::string getMarque () {}
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	virtual std::string getMarque () = 0;
    ça rendra la classe non instanciable, et fera donner au compilateur l'ensemble des points qui posent problèmes... ensuite... pour les réparrer :

    modifie un renvoie de variable en renvoie de référence, et au lieu de stocker des variables, stocke des pointeurs...

    ceci te permettra d'utiliser la polymorphie...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    A l'aise, ca marche nickel.

    Merci Swoög

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 12h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 19h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 14h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 15h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 12h18

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