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 :

Problème héritage et construction de classe


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut Problème héritage et construction de classe
    Bonjour,

    je suis en train de développer une classe c++ qui hérite d'une autre classe à laquelle je n'ai pas accès et à l'appel d'une méthode de la classe mère pour initialiser un attribut, ça plante: std::bad_alloc.

    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
    #ifndef VEHICLE_CPP
    #define VEHICLE_CPP
     
    #include "Vehicle.h"
     
    Vehicle::Vehicle() : PEADOS::Vehicle()
    {
    }
     
    Vehicle::~Vehicle(void)
    {
    }
     
    string Vehicle::getIdent(void)
    {
    	return ident;
    }
     
    void Vehicle::setVehicle(Interface::Vehicle* vehicle)
    {
    	ident = vehicle->ident();
    	groupIdent = vehicle->groupIdent();
    	string m_type = vehicle->type();
    	setType(m_type);
    	setFuel(vehicle->fuel());
    	setPosition(vehicle->positionV()->x(), vehicle->positionV()->y(), (double)0);
    	return;
    }
     
    #endif
    J'appelle la méthode comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vehicle* newVehicle = new Vehicle();
    newVehicle->setVehicle(vehic);
    et ça plante au niveau du setType uniquement, les autres set de la classe mère fonctionnent bien.

    Quelqu'un voit une erreur?

    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Evites de définir des méthodes qui seront définit automatiquement par le compilateur si elles ne font rien de spéacial (tu feras pas mieux que lui).

    Quel est le type de m_type, la signature de setType et ce quel doit faire ?

    PS: Tu es certain de pouvoir hériter de cette classe ? Le destructeur est bien virtuel ?

  3. #3
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Bonsoir,

    je ne comprends pas l'appel fait dans ton constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Vehicle::Vehicle() : PEADOS::Vehicle()
    {
    }
    Ta classe Vehicle hérite d'une autre classe également nommée Vehicle?
    Si c'est cela, je pense qu'il serait préférable de nommer autrement ta classe pour éviter toute ambiguïté.
    Peut-être que ton problème vient de là?

    Ca peut devenir problématique si des "using namespace" sont utilisés...
    Si j'ai bien compris, tu as ta propre classe Vehicle, celle dans PEADOS et celle dans Interface?
    Est-ce que par hasard, il n'y aurait pas un using namespace PEADOS ou using namespace Interface dans le fichier où se produit l'erreur?

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    @Flob90
    m_type est un string et la signature de la fonction est void setType(string & name)
    je ne vois rien qui fait que je ne pourrais pas hériter de cette classe et le destructeur est bien virtuel.

    @Aleph69
    On m'a conseillé d'écrire le constructeur de cette façon pour forcer à appeler celui de la classe mère en premier.
    Oui c'est bien ça ma classe Vehicle hérite d'une autre classe appelée aussi Vehicle, mais j'ai essayé de la renommer pour tester, ça n'a rien changé!
    En effet, j'ai également une classe Vehicle dans Interface, mais je n'ai pas mis de using namespace dans le fichier où se produit l'erreur.

  5. #5
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    j'ai une autre question?

    pourquoi as tu cela?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef VEHICLE_CPP
    #define VEHICLE_CPP
    ...
    #endif
    normalement cela n'est à faire que sur des .h pour éviter les doubles inclusions.

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    j'ai une autre question?

    pourquoi as tu cela?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef VEHICLE_CPP
    #define VEHICLE_CPP
    ...
    #endif
    normalement cela n'est à faire que sur des .h pour éviter les doubles inclusions.
    ah ok, je savais pas! merci

  7. #7
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Bonjour,

    que se passe-t-il si tu passes par le constructeur par copie de PEADOS::Vehicle?
    En d'autres termes, essaye de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Vehicle* newVehicle = new Vehicle();
    newVehicle->setVehicle(vehic);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Vehicle* newVehicle = new Vehicle(vehic);
    Donne-nous également Vehicle.h et la manière dont est construit vehic dans ton prochain message s'il-te-plaît.
    Il y a peut-être une donnée membre mal allouée.
    Si la méthode setType est implémentée autrement que comme cela, ca serait bien de la donner également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Vehicle::setType(string const & name)
    {
        this->type = name;
    }

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Si le destructeur n'était pas virtuel tu n'aurais pas dû hériter par exemple, mais comme ce n'est pas le cas ton héritage peut être bon. (si tu l'as jugé pertinant, on va dire qu'il l'est )

    Enlèves ton constructeur et ton destructeur, il ne font rien, le compilateur les fera aussi bien que toi. Et la personne qui t'as conseillé cette écriture ne doit pas être au courant que le constructeur de la classe mère sera quand même appelé même si tu ne lui dis pas.

    Pour setType je demandais ca que je ne vois pas d'initialisation de m_type, mais si il s'agit d'un string il est forcément initialisé par le constructeur et n'a pas de raison de produire une erreur.

  9. #9
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Re,

    j'ai une dernière question.
    Pourquoi fais-tu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string m_type = vehicle->type();
    setType(m_type);
    setFuel(vehicle->fuel());
    et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    setType(vehicle->type());
    setFuel(vehicle->fuel());

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 7
    Par défaut
    Le constructeur de la classe mère (PEADOS::Vehicle) ne prend pas le type de Interface::Vehicle en paramètre

    Voici mon .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
    #ifndef VEHICLE_H
    #define VEHICLE_H
     
    #include "InterfaceC.h"
     
    #include "peados.h"
    #include "exports.h"
     
    class Vehicle : public PEADOS::Vehicle
    {
    private:
    	string ident;
    	string groupIdent;
     
    public:
    	Vehicle();
    	~Vehicle(void);
    	string getIdent(void);
    	void setVehicle(Interface::Vehicle* vehicle);
    };
     
    #endif
    Je récupère l'objet vehic d'une liste présente sur le serveur (c'est une application client/serveur CORBA). La valeur de chaque attribut est passée par une boite à bouton côté serveur.

    Pour le setType je n'y ai pas accès, mais a priori il ne fait rien d'autre.

    J'ai remplacé par setType((string)vehicle->type()); c'était un oubli de modification!

  11. #11
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Re,

    J'ai remplacé par setType((string)vehicle->type()); c'était un oubli de modification!
    Il est possible que le problème vienne de là.
    Pourquoi dois-tu transtyper?
    Quel type d'objet retourne la méthode type()?

Discussions similaires

  1. problème (héritage || class || constructeur )?
    Par crazy_inf dans le forum C++
    Réponses: 3
    Dernier message: 29/06/2008, 23h07
  2. Problème héritage et classes abstraites
    Par sebzinzin dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2007, 19h24
  3. [C#] : Problème de construction de class
    Par dcollart dans le forum C#
    Réponses: 24
    Dernier message: 29/10/2006, 14h54
  4. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 17h00
  5. Réponses: 12
    Dernier message: 01/07/2004, 12h03

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