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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 é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;
    }

  4. #4
    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 ?

  5. #5
    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

  6. #6
    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.

  7. #7
    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.

+ 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