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 :

probleme de virtual dans la classe fille


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut probleme de virtual dans la classe fille
    salut
    voila j'ai une classe mere et une classe fille

    dans la classe fille je crrer un constructeur avec les parametre de la classe mere plus les nouveau de la classe fille pour mes variable

    jai une procedure de saisie dans la classe fille que j'ai mis en virtuel mais cela ne marche pas car je suis obliger de mettre des valeurs bidon dans mon constructeur pour que cela fonctionne

    voici le code en virtuel de la classe fille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	chocolat_blanc(char Pnom, float Ppoid, float Pprix_init, int Pquantite_cacao, int Pquantite_beurre, int Pquantite_lait):chocolat(Pnom, Ppoid, Pprix_init, Pquantite_cacao)
    	{
    		quantite_beurre=Pquantite_beurre;
    		quantite_lait=Pquantite_lait;
    	}
    	virtual void saisie();
    ma procedure de saisie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    virtual void chocolat_blanc::saisie()
    {
    	chocolat::saisie();
    	cout<<"saisir la quantite de beurre"<<"\n";
    	cin>>quantite_beurre;
     
    	cout<<"saisir la quantite de lait"<<"\n";
    	cin>>quantite_lait;	
    }
    et voici comment je suis obligr de faire pour que cela fonctionne:
    chocolat_blanc(char Pnom="", float Ppoid=0, float Pprix_init=0,......
    voila je comprend pas pourquoi


    merci par avance

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    : j'ai pas compris quel était le pb. le constructeur ou la fonction de saisie ?
    quel est le message d'erreur ?
    comment as-tu instancié l'objet chocolat_blanc que tu utilises ?

  3. #3
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    parce k'il faut initialiser toutes les variables avant de pouvoir s'en servir. Au niveau du constructeur de la classe mère peut etre ? Ou en l'appelant explicitement ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    heuu

    voila comment je l'appel dans mon prog principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void main()
    {
    	chocolat_blanc un_chocolat_blanc;
     
    	un_chocolat_blanc.saisie();
    	un_chocolat_blanc.affichage();
    }
    et voici le constructeur de ma classe mere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    dans la classe:
    public:
    	chocolat(char Pnom, float Ppoid, float Pprix_init, int Pquantite_cacao);
     
    declaration :
    chocolat::chocolat(char Pnom, float Ppoid, float Pprix_init, int Pquantite_cacao)
    {
    	nom=Pnom;
    	poid=Ppoid;
    	prix_init=Pprix_init;
    	quantite_cacao=Pquantite_cacao;
    }
    voila par contre je takine pas trop le c++ alors je sais pas si c juste ce ke je fait et lerreur c au niveau de la declaration du constructeur dans le prog principale

    voici lerreur :
    error C2512: 'chocolat_blanc' : no appropriate default constructor available
    par contre si je met des valeur genre nom="" poid=0.... et que je saisie nom='a', poid =100.... bin apres sa marche bien
    mais normalement avec la declaration de la saisie en virtuel cela devrai fonctionner aussi non?

  5. #5
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Salut,

    Effectivement, tu déclares:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chocolat(char Pnom, float Ppoid, float Pprix_init, int Pquantite_cacao) 
     
    et
     
    chocolat_blanc(char Pnom, float Ppoid, float Pprix_init, int Pquantite_cacao, int Pquantite_beurre, int Pquantite_lait)
    :chocolat(Pnom, Ppoid, Pprix_init, Pquantite_cacao)
    ce qui signifie que pour construire un chocolat, ou un chocolat blanc, il faut préciser tous ces parametres (nom, poids, ...).

    Et là tu essayes d'en construire un sans rien paramétrer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chocolat_blanc un_chocolat_blanc;
    Une solution serait de passer les parametres à la création de ton chocolat blanc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chocolat_blanc un_chocolat_blanc("test",100,10,50,50,50);
    ... mais dans ton cas on dirait plutôt:
    - que tu veux construire un chocolat blanc "vierge"
    - utiliser saisie() pour le parametrer

    Donc à ce moment là, il faut créér un constructeur sans parametre, pour pouvoir créér des chocolats vierges. Mais attention, dans ce constructeur, initialise tes variables membres avec des valeurs par défaut histoire qu'elles soient initialisées (sinon si on affiche() avant de saisir(), ça va surement planter).

    Mais ta solution avec des valeurs par défaut pour les parametres du constructeur fonctionne aussi (ça revient au même pour la compilateur).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par bigquick
    ... mais dans ton cas on dirait plutôt:
    - que tu veux construire un chocolat blanc "vierge"
    - utiliser saisie() pour le parametrer
    salut merci de ta reponse effectivement c ce que je veus faire
    mais j'iai pas compris le coup de creer un constructeur sans parametre et apres donner aux parametres les valeur saisie
    je fais un constructeur comme ceci :
    classe fille


    public:
    chocolat_blanc():chocolat(parametre1,........);
    fin classe

    declaration
    chocolat_blanc::chocolat_blanc
    {
    }
    un truk comme sa tu veus dire?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par bigquick
    ... mais dans ton cas on dirait plutôt:
    - que tu veux construire un chocolat blanc "vierge"
    - utiliser saisie() pour le parametrer
    salut merci de ta reponse effectivement c ce que je veus faire
    mais j'iai pas compris le coup de creer un constructeur sans parametre et apres donner aux parametres les valeur saisie
    je fais un constructeur comme ceci :
    classe fille


    public:
    chocolat_blanc():chocolat(parametre1,........);
    fin classe

    declaration
    chocolat_blanc::chocolat_blanc
    {
    }
    un truk comme sa tu veus dire?

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    il me semblait qu'on avait répondu à la question ici
    http://www.developpez.net/forums/viewtopic.php?t=330121

  9. #9
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Ah oui en effet ça a déjà été traité!

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    bon je reiterre ma question car jarrive utiliser le constructeur de la classe mere et de la classe fille en fesant sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    classe mere :
    chocolat::chocolat()
    {
    	cout<<"constructeur de la classe mere"<<"\n";
    	nom='a';
    	poid=100;
    	quantite_cacao=20;
    	prix_init=50;
     
    }
    classe fille :

    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
     
    class chocolat_blanc : public chocolat
    {
    private:
    	int quantite_beurre;
    	int quantite_lait;
    	double prix_vente();
    public:	
    	chocolat_blanc():chocolat()
    	{
    		quantite_beurre=10;
    		quantite_lait=30;
    	}
    	void saisie();
    	void affichage();
    };
    et je voudrai au lieu de donner des valeur fixe , utiliser mes procedure de siaisies que voici
    classe mere :
    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
     
    void chocolat::saisie()
    {
    	cout<<"saisir le nom du chocolat"<<"\n";
    	cin>>nom;
     
    	cout<<"saisir le poid du chocolat"<<"\n";
    	cin>>poid;
     
    	cout<<"saisir le prix initial du chocolat"<<"\n";
    	cin>>prix_init;
     
    	cout<<"saisir la quantité de cacao"<<"\n";
    	cin>>quantite_cacao;
    }
    elle est bien sur en virtuel


    et la classe fille :
    void chocolat_blanc::affichage()
    {
    cout<<"les ingredients du chocolat blanc sont :"<<"\n";
    chocolat::affichage();
    cout<<"\n";
    cout<<"la quantite de beurre : "<<quantite_beurre<<"\n";
    cout<<"la quantite de lait : "<<quantite_lait<<"\n";
    }

    voila merci par avance

  11. #11
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Si elle est virtuelle tu ne pourras pas l'appeler dans ton constructeur (enfin il me semble).

    Par contre, est-ce qu'elle a forcément besoin d'etre virtuelle?
    Si elle ne l'est pas, tu pourras faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    chocolatblanc::chocolatblanc()
    {
       saisie();
    }
     
    chocolatblanc::saisie()
    {
       chocolat::saisie();
       // demander le reste
    }

    Par contre le code suivant ne fera pas ce qu'on espère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chocolat* p = new chocolatblanc;
    p->saisir(); // appelle la saisie d'un chocolat
    Mais tu peux rendre cette méthode de saisie privée si elle n'est appelée que dans le constructeur...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    merci bien sa marche sans le virtuel
    par contre apres jai un autre souci car si je fais sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void main()
    {
    	cout<<"affichage et saisie du chocolat"<<"\n";
    	chocolat un_chocolat;	
    	un_chocolat.affichage();
    		cout<<"affichage et saisie du chocolat blanc"<<"\n";
    	chocolat_blanc un_chocolat_blanc;
    	un_chocolat_blanc.affichage();
    }
    pour le chocolat blanc il me demande de saisir 2 fois les info lol

  13. #13
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 97
    Points : 91
    Points
    91
    Par défaut
    Peux tu montrer ton nouveau code ?

    Si tu as fait un appel à saisie dans les deux constructeurs, il est normal qu'il te demande deux fois les infos puisque que la contscruction d'un enfant appel la construction du parent. Mais bon tu n'as peut être pas fait ça ...

  14. #14
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Normalement il va te demander 1 fois les infos du chocolat, puis 1 fois les infos du chocolat blanc (donc celles de base + les ajouts pour en faire du blanc).

    Tu coup tu dois saisir 2x les infos pour le chocolat, mais c'est normal car ce n'est pas la même instance (ton chocolat blanc n'est pas obligé d'avoir la meme base que le chocolat que tu as créé juste avant!).

    Si tu veux que ton chocolat blanc utilise cette config de base, il faut revoir ton architecture, ou imposer un parametre du type "chocolat" dans le constructeur de chocolat blanc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chocolatblanc::chocolatblanc(const chocolat& _c)
    {
         nom = _c.nom;
         prix = _c.prix;
         ...
    }

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par sg-40
    Peux tu montrer ton nouveau code ?

    Si tu as fait un appel à saisie dans les deux constructeurs, il est normal qu'il te demande deux fois les infos puisque que la contscruction d'un enfant appel la construction du parent. Mais bon tu n'as peut être pas fait ça ...
    en fait oui jai fais cela car sinon sa me mets des chiffre et de caractere bizar quand jexecute pourtant pas de faute
    mais la je pense que je vais chercher la solution

    merci beaucoup en tout cas
    ++

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par bigquick
    Normalement il va te demander 1 fois les infos du chocolat, puis 1 fois les infos du chocolat blanc (donc celles de base + les ajouts pour en faire du blanc).

    Tu coup tu dois saisir 2x les infos pour le chocolat, mais c'est normal car ce n'est pas la même instance (ton chocolat blanc n'est pas obligé d'avoir la meme base que le chocolat que tu as créé juste avant!).

    Si tu veux que ton chocolat blanc utilise cette config de base, il faut revoir ton architecture, ou imposer un parametre du type "chocolat" dans le constructeur de chocolat blanc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chocolatblanc::chocolatblanc(const chocolat& _c)
    {
         nom = _c.nom;
         prix = _c.prix;
         ...
    }
    et _c sa a un unom special?

    car si je fai comme tu ma dis avec nom= _c.nom cela me dis que je ne peus pas acceder au methode prive
    doie je faire des get sur les membre priver comme le nom...?

  17. #17
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    si tu veux pouvoir accéder aux variables de la classe chocolat depuis ses classes filles, il faut les déclarer comme protected et non pas comme private 8)

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par bigquick
    si tu veux pouvoir accéder aux variables de la classe chocolat depuis ses classes filles, il faut les déclarer comme protected et non pas comme private 8)
    oui en plus je lai fais pour dautre variable mais la entre le forum et google je commenc e a perdre les peadle en tout cas merci beaucoup de ton aide

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 164
    Points : 64
    Points
    64
    Par défaut
    a bin jai pas eu besoin de faire comme tu ma dis jai fais sa et sa marche nikel regarde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    void main()
    {
    	cout<<"affichage et saisie du chocolat"<<"\n";
    	chocolat un_chocolat;
    	un_chocolat.saisie();
    	un_chocolat.affichage();
     
    	cout<<"affichage et saisie du chocolat blanc"<<"\n";
    	chocolat_blanc un_chocolat_blanc;
    	un_chocolat_blanc.affichage();
    }
    voila sa amrche sans souci car jai elever la saisie dans chocolat et jai fais chocolat.saisie()

    en tout cas merci de ton aide
    ++

  20. #20
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Euh
    en effet ça doit compiler et se lancer, mais tu es sur que l'affichage est OK ?

    parceque là, si j'ai bien tout suivi, la partie "chocolat" de ton chocolatblanc n'est jamais initialisée (à omins que tu aies remis des valeurs par défault dans le constructeur de chocolat...)

    Enfin dans tous les cas, le nom, prix, poids etc... de ton chocolatblanc ne seront pas ceux que tu auras saisi pour ton chocolat de base (il n'y a rien qui les lie)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/11/2009, 00h20
  2. Lien d'héritage non visible dans la classe fille
    Par trotters213 dans le forum C++
    Réponses: 2
    Dernier message: 15/12/2007, 12h47
  3. Réponses: 2
    Dernier message: 11/12/2007, 14h03
  4. Initialisation const dans une classe fille
    Par cyberjoac dans le forum C++
    Réponses: 3
    Dernier message: 07/10/2007, 17h53
  5. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35

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