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

MFC Discussion :

Probleme d'apel de fonction dans une autre classe


Sujet :

MFC

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut Probleme d'apel de fonction dans une autre classe
    Bonjour, je souhaite faire des fonctions de sauvegarde dans différentes classes d'un projet mais j'ai un probleme pour appelé la deuxième fonction. Je m'explique, je suis dans la classe Ligne et je veux apeller a l'intérieur de la fonction de sauvergarde de le classe Ligne la fonction de sauvegarde de la classe CBoucle_Principale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    void CLigne::sauvegarderXML()
    {
    ofstream fichier("config.xml", ios_base::app);
    fichier<<"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
    fichier<<"<!DOCTYPE config_ligne_dtd SYSTEM \"config_ligne_dtd.dtd\">\n";
    fichier<<"\n";
    fichier<<"<Ligne identification=\"\">\n";
    fichier<<"\n";
    fichier.close();
    CBoucle_Principale::sauvegarderXML();
    }
    
    et la une erreur se produit : "e:\projet vf\simuligne2006\Ligne.cpp(173): error C2352: 'CBoucle_Principale::sauvegarderXML' : appel non conforme d'une fonction membre non static

    Donc voila je pense que c'est l'apel de la fonction qui ne va pas mais je ne sais pas et ne trouve pas comment il faut faire.

    Merci d'avance pour toute aide.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu as le droit de faire ça que si
    CBoucle_Principale est la classe parent de CLigne ce qui ne doit pas etre la cas ici .
    donc l'appel est interpreté comme celui d'une fonction statique,
    ce qui ne doit pas etre le cas non plus ....


  3. #3
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Si je fais ça car la classe Boucle_principale hérite de la classe Ligne justement c'est bien sa que tu entends par "CBoucle_Principale est la classe parent de CLigne"
    ?

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par freecell31
    Si je fais ça car la classe Boucle_principale hérite de la classe Ligne justement c'est bien sa que tu entends par "CBoucle_Principale est la classe parent de CLigne"
    ?
    ben non c'est l'inverse : pour faire ton appel la classe CLigne doit heriter de CBoucle_Principale et non l'inverse ...

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Oui mais pour moi c'est la classe Boucle_Principale qui hérite de Ligne donc comment je peux faire?
    merci d'avance

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    en général on fait en sorte que la fonction soit virtuelle (sauvegarderXML)
    et dans la classe heritée on redefinit la fonction en appelant la fonction de la classe de base ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    void CBoucle_Principale::sauvegarderXML( ofstream &rStream)
    {
        CLigne::sauvegarderXML(rStream);
       // sauvegardes complementaires...
    }
    //CLigne *pLigne= new   CBoucle_Principale ;
    ofstream fichier("config.xml", ios_base::app);
    pLigne->sauvegarderXML(fichier);



  7. #7
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Ok pour les classes héritée mais comment je fais pour la classe de base (Ligne)?

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CLigne::sauvegarderXML()
    {
    ofstream fichier("config.xml", ios_base::app);
    fichier<<"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
    fichier<<"<!DOCTYPE config_ligne_dtd SYSTEM \"config_ligne_dtd.dtd\">\n";
    fichier<<"\n";
    fichier<<"<Ligne identification=\"\">\n";
    fichier<<"\n";
    fichier.close();
    ... // inclure ici les lignes de code que l'on veut pouvoir exécuter
    }

  9. #9
    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
    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
    void CLigne::sauvegarderXML()
    {
       ofstream fichier("config.xml", ios_base::app);
       fichier<<"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
       fichier<<"<!DOCTYPE config_ligne_dtd SYSTEM \"config_ligne_dtd.dtd\">\n";
       fichier<<"\n";
       fichier<<"<Ligne identification=\"\">\n";
       fichier<<"\n";
       fichier.close();
    
       toto();
    }
    
    void CLigne::toto()
    {
       ...
    }
    
    void CBoucle_Principale::sauvegarderXML( ofstream &rStream)
    {
        CLigne::sauvegarderXML(rStream);
       // sauvegardes complementaires...
    }
    
    /* ou si tu ne veux faire que toto() */
    
    void CBoucle_Principale::sauvegarderXML( ofstream &rStream)
    {
        toto();
    }

  10. #10
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Je ne comprends pas très bien le code donné... dsl je vais essayer d'expliquer un peu mieux : J'ai la classe Ligne, puis la classe Boucle_principale qui hérite de Ligne ensuite la classe Troncon qui hérite de Boucle_principale puis la classe Case qui hérite de troncon et ainsi desuite. Chaque classe ont une fonction de sauvegarde (sauvegardeXML) et je dois sauvegarder par ces fonctions différents paramètres de chaque classe dans un fichier au format XML.
    A l'appel de la fonction sauvegarderXML de la classe Ligne je devrais donc ecrire les données puis apeler la fonction sauvegarderXML de la classe héritée ( dans mon cas Boucle_principale) puis ainsi desuite.
    Voila j'espere avoir été plus clair.
    Merci pour votre aide

  11. #11
    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
    Citation Envoyé par freecell31
    Voila j'espere avoir été plus clair.
    Merci pour votre aide
    C'est parfaitement clair depuis le départ. Mais ce que tu tentes de faire n'est pas possible, ce n'est pas comme ça que marche l'héritage. Pout te donner un exemple c'est comme si tu disais que tes parents ont hérités de tes gènes alors que c'est l'inverse.

    Tu veux que la classe mère exécute une fonction de la classe fille. Impossible, il n'y a que les enfant qui peuvent exécuter du code provenant d'une classe mère.

  12. #12
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Salut, je ne veux pas qu'elle l'execute je veux juste qu'elle l'apelle a moins que sa soit pareil

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par bigboomshakala
    C'est parfaitement clair depuis le départ. Mais ce que tu tentes de faire n'est pas possible, ce n'est pas comme ça que marche l'héritage. Pout te donner un exemple c'est comme si tu disais que tes parents ont hérités de tes gènes alors que c'est l'inverse.

    Tu veux que la classe mère exécute une fonction de la classe fille. Impossible, il n'y a que les enfant qui peuvent exécuter du code provenant d'une classe mère.
    Euh... Une fonction de la classe mère qui appelle une fonction protected virtuelle, ça marche très bien...

    les streambuf de la bibliothèque standard sont basés sur ce principe...

  14. #14
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Salut Medinoc peut tu etre plus explicite dans ta réponse car j'ai fait quelque recherche par rapport à ce que tu as dit mais je ne trouve pas la solution. Peut tu me donner un exemple par rapport à ce que j'ai dis? Merci d'avance

  15. #15
    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
    Euh... Une fonction de la classe mère qui appelle une fonction protected virtuelle, ça marche très bien...
    ça je sais. dans le principe c'est le code que j'ai donné, avec toto virtuel. (j'ai n'ai pas indiqué que toto était virtuel dans mon exemple)
    la classe mère réalise l'appel (et l'exécution de son toto), la classe fille redéfini toto...
    l'exemple que j'ai donné n'était pas à recopier texto, c'était à adapter aux besoins...

    Citation Envoyé par bigboomshakala
    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
    void CLigne::sauvegarderXML()
    {
       ofstream fichier("config.xml", ios_base::app);
       fichier<<"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
       fichier<<"<!DOCTYPE config_ligne_dtd SYSTEM \"config_ligne_dtd.dtd\">\n";
       fichier<<"\n";
       fichier<<"<Ligne identification=\"\">\n";
       fichier<<"\n";
       fichier.close();
    
       toto();
    }
    
    void CLigne::toto()
    {
       ...
    }

  16. #16
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    je suis désolé mais je ne comprends pas à quoi sert cette fonction toto...
    Je ne peux pas tout simplement mettre la fonction sauvergargerXML() de la classe fille de CLigne (donc celle de CBoucle_Principale) en protected virtuelle puisque sa fonctionne apparement?

  17. #17
    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
    Re,

    tu peux nous montrer le contexte dans lequel tu veux sauvegarder tes données (un bout de code appelant la fonction sauvegardeXML) pour voir ce que tu essaies de faire ? parce que d'après les messages précédent tu n'as pas compris comment fonctionne l'héritage/polymorphisme et tu as peut-être un problème de conception.


  18. #18
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    le contexte dans lequel tu veux sauvegarder tes données


    un bout de code appelant la fonction sauvegardeXML


    je suis vraiment désolé mais je ne comprends pas et en plus j'avais déja ce probleme je ne vois pas comment la fonction sauvegarderXML de CLigne est apelé. Mais la je suis en vacances j'ai pas l'aide de mes profs et je suis en galère! si quelqu'un peut m'aider... merci d'avance

  19. #19
    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
    c'est toi qui a codé les classes CLigne et CBoucle_Principale ?
    tout ce que je peux te dire à ce stade c'est que tu as grand besoin de (re)voir la notion d'héritage et de refaire une passe sur ton cours de C++ en général.
    on ne peut pas t'aider si tu es toi-même incapable de nous expliquer le contexte dans lequel tu te trouves et pour lequel tu penses être obligé d'appeler une méthode fille dans la classe mère.
    a priori toutes les clés pour résoudre ton problème ont été donné dans les précédentes réponses.

    cour, FAQ, livres C++

  20. #20
    Débutant
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Les classes étaient déja codé j'ai juste a ajouter une fonction de sauvegarde moi et vu qu'il y a déja ces relations d'héritages entre les classes ben je l'ai fait comme ça mais sa ne marche pas j'ai meme essayé de mettre les fonctions sauvegarderXML des classes filles en protected et virtual mais sa change rien...

Discussions similaires

  1. Appel d'une fonction dans une autre classe
    Par Analfabete dans le forum wxPython
    Réponses: 3
    Dernier message: 01/10/2007, 09h45
  2. Réponses: 2
    Dernier message: 22/12/2006, 11h35
  3. Réponses: 3
    Dernier message: 30/11/2006, 06h25
  4. Probleme appel de fct dans une autre classe
    Par crakotte_finance dans le forum C++
    Réponses: 6
    Dernier message: 09/10/2006, 21h22
  5. PHP4 appel d'une fonction dans une autre
    Par cmicdev dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2006, 11h37

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