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 confirm�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mai 2002
    Messages
    94
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 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 �clair�
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    D�tails du profil
    Informations personnelles :
    �ge : 33
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    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 !

  3. #3
    Membre confirm�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mai 2002
    Messages
    94
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 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 �clair�
    Avatar de warubi
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    399
    D�tails du profil
    Informations personnelles :
    �ge : 33
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 399
    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;
    }

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    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 confirm�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mai 2002
    Messages
    94
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 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 chevronn�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    D�tails du profil
    Informations personnelles :
    �ge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    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 confirm�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mai 2002
    Messages
    94
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 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 chevronn�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    D�tails du profil
    Informations personnelles :
    �ge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    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 confirm�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mai 2002
    Messages
    94
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 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 confirm�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mai 2002
    Messages
    94
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 chevronn�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    D�tails du profil
    Informations personnelles :
    �ge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    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 confirm�
    Homme Profil pro
    Architecte de syst�me d'information
    Inscrit en
    Mai 2002
    Messages
    94
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Architecte de syst�me d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 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 : 51
    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
    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