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 :

Question pure C++


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut Question pure C++
    Bonjour, j'ai une erreur dans mon code que je n'arrive pas à résoudre, je sais d'ou elle vient. En fait, je ne sais pas si ce que je cherche à faire est faisable.

    Pour faire simple j'ai une classe de base Base et une classe dérivée de la classe Base, la classe Derivee.


    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
     
    class Base {
      public:
        void fonction1() {
            fonction2();             // erreur ici
        };
     
      private:
        virtual void fonction2() const = 0;
    };
     
    class Derivee : public Base {
      public:
        void fonction2() const {
          cout << "lalala" << endl;
        };
    };
    Donc, l'erreur vient de l'appel à la fonction fonction2(), cette fonction est virtuelle pure dans la classe de base, elle est définie dans la classe dérivée (évidemment, dans mon code j'ai plusieurs classes dérivées). L'erreur est générée au linkage, j'ai une erreur indéfinie sur fonction2().

    Je cherche à appeler la fonction2() qui est membre de la classe Derivee, mais cet appel est réalisé dans la classe Base, est-ce faisable ? Ou sinon, comment faire quelque chose de semblable autrement ? J'ai regardé du côté des dynamic_cast et typeid() mais ça ne m'apporte pas grand chose.

    Merci.

    Bouba

  2. #2
    Membre actif
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Points : 204
    Points
    204
    Par défaut
    Ca ressemble un peu a du c++ !
    Je te conseille un bon cours a cette adresse : http://c.developpez.com/cours/
    Bonne continuation !
    L'exces en tout est la ruine de l'homme "Alexandre"
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    A, mince, dsl, voilà c'est modifié. Mon code est un peu long, j'ai donc fait un exemple plus court (un peu en speed, j'ai zappé l'héritage) pour illustrer le blem rencontré, pas une ptite idée pour le résoudre ?

    Merci pour m'avoir signalé l'oubli de l'héritage dans mon msg.

  4. #4
    Membre actif
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    Points : 204
    Points
    204
    Par défaut
    De plus on ne declare pas une fonction a l'interieur d'une classe. Et pourquoi met tu un point virgule a la fin du bloc de la fonction alors que ceci est valable que pour la definition d'une classe.
    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
     
    class Base
     {
     public:
     void fonction1() ;          
     private:
     virtual void fonction2() const = 0;
    };
     
    class Derivee : public Base 
    {
     public:
     virtual void fonction2() const = 0; 
    };
     
    void Derivee::fonction2()
    {
    cout << "lalala" << endl;
    }
    L'exces en tout est la ruine de l'homme "Alexandre"
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main()
    { 
        Base* pointeur = new Derivee;
        pointeur->fonction1();
     
        return EXIT_SUCCESS;
    }
    appellera la fonction Derivee::fonction2. Est-ce que ça résoud ton problème ?

  6. #6
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    warubi> "on ne declare pas une fonction a l'interieur d'une classe", oui, je ne le fais jamais, tellement peu que je nesais même plus qu'il ne faut pas de ';' à la fin du corps. Cependant, un ';' n'a tout simplement aucun effet, :-).

    roulious> Ok, c'est exactement ce que je fais dans mon code, normalement ça devrait donc fonctionner ?

    en fait, j'ai ça comme classe de base:

    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
     
    class SVM : public Classifieur {	
    	public:
    		virtual ~SVM();	
    		void entrainer(const Base &) throw(ExceptionParametre);
    ...
    ...
    ...
    	protected:
    ...
    ...
    ...	
    		virtual const unsigned int verifierParametres() const = 0;		
    };
     
    ...
     
    void SVM::entrainer(const Base & baseApprentissage) throw(ExceptionParametre) { 
    ...
    verifierParametres();     // ERREUR ICI JE PENSE
    ...
    }
    Puis, par exemple, dans une des classes dérivées:
    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
     
    class CSVC : public SVM
    {
    	public:
    		CSVC();
    		CSVC(const double & c);
    		~CSVC();
    ...
    ...
    	private:
    		const unsigned int verifierParametres() const;
    };
     
    ...
     
    const unsigned int CSVC::verifierParametres() const {
    	if(parametres.C <= 0)
    		return ERREUR_SVM_PARAMETRE_C;	
     
    	const unsigned int erreurParametresFonctionNoyau = SVM::verifierParametresFonctionNoyau();
     
    	if(erreurParametresFonctionNoyau)
    		return erreurParametresFonctionNoyau;
     
    	return SVM::verifierParametresGeneraux();
    }
    Voilà, le linker me renvoi l'erreur suivante:
    /usr/bin/ld: Undefined symbols:
    SVM::verifierParametres() const
    collect2: ld returned 1 exit status
    C'est comme si le linker essayait de trouver une définition de verifierParametres() dans la classe SVM. Alors que dans cette classe la définition de verifierParametres() est impossible puisqu'elle est virtuelle pure !

    Je pige pas tout la, tu vois d'ou peut venir l'erreur ? Peut-être que ce que je fais est tout simplement interdit non ?

    Merci.

    Bouba

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par bouba
    C'est comme si le linker essayait de trouver une définition de verifierParametres() dans la classe SVM.
    Montre donc comment tu fais ton appel, ça sera plus simple.

    Citation Envoyé par bouba
    Alors que dans cette classe la définition de verifierParametres() est impossible puisqu'elle est virtuelle pure !
    Rien n'interdit de définir une fonction virtuelle pure. Ça peut servir par exemple pour un destructeur : la classe de base contient des données qu'elle doit détruire et force chacune de ses classes filles concrètes à définir un destructeur.

  8. #8
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    En fait, pour le moment je n'ai réalisé aucun appel, je viens de l'enlever et l'erreur persiste.

    la classe de base contient des données qu'elle doit détruire et force chacune de ses classes filles concrètes à définir un destructeur.
    force ? Obligatoirement ? Si je n'ai aucun pointeur à libérer dans ma classe dérivée je suis obligé de définir un destructeur dans celle-ci ?

    Merci.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par bouba
    force ? Obligatoirement ?
    Si tu veux que la classe fille soit concrète, alors oui, il faut définir toutes les fonctions virtuelles pures des classes mères.

    Citation Envoyé par bouba
    Si je n'ai aucun pointeur à libérer dans ma classe dérivée je suis obligé de définir un destructeur dans celle-ci ?
    Non, c'était juste dans l'exemple où une classe définit une fonction virtuelle pure. Par contre, une classe dont tu es amené à hériter devrait toujours avoir un destructeur virtuel pour être sur de ne pas avoir de fuite de mémoire.

  10. #10
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Ok, j'ai fais ça sur un exemple très simple et tout fonctionne correctement, je dois avoir une erreur ailleur.

    Merci toute l'aide que vous m'avez donné.

    Bouba

  11. #11
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Op op op, bon, j'avais une erreur complètement stupide. Dans une des fonctions verifierParametres() d'une de mes classe dérivée je faisait un appel à SVM::verifierParametres().

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 376
    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 376
    Points : 41 545
    Points
    41 545
    Par défaut
    Le code du post départ était bon, à cela près qu'il me semble qu'une fonction virtuelle doit être protected et non private (mais je peux me tromper).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par Médinoc
    Le code du post départ était bon, à cela près qu'il me semble qu'une fonction virtuelle doit être protected et non private (mais je peux me tromper).
    Je ne crois pas que le type d'accès change quoi que ce soit : lorsqu'il appelle fonction1 à partir d'un pointeur sur Base, le compilo s'aperçoit que c'est un objet de type Derivee, fait le cast, et utilise les fonctions de la classe Derivee. Faudrait se plonger dans le standard pour savoir ce qu'il en est exactement. C'est en tout cas le comportement de gcc (3.4)

  14. #14
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Ouai, je viens de tester avec une fonction virtuelle pure en private et ça fonctionner très bien.

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Médinoc
    Le code du post départ était bon, à cela près qu'il me semble qu'une fonction virtuelle doit être protected et non private (mais je peux me tromper).
    Non seulement, elle peut être privée, mais c'est même assez recommandé. Lire par exemple :http://www.gotw.ca/publications/mill18.htm
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. question de code pure sur les headers
    Par deubelte dans le forum Débuter
    Réponses: 2
    Dernier message: 09/09/2010, 19h10
  2. question de code pure sur const_cast
    Par deubelte dans le forum C++
    Réponses: 4
    Dernier message: 30/07/2010, 13h41
  3. question sur les classes virtuelles pures
    Par deubelte dans le forum C++
    Réponses: 5
    Dernier message: 26/07/2010, 16h45
  4. Réponses: 3
    Dernier message: 17/09/2008, 13h52
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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