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

Langage C++ Discussion :

[Boost.bind] binder method d'une classe derivée depuis la base


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Par défaut [Boost.bind] binder method d'une classe derivée depuis la base
    Bonjour Tout le monde,

    j'ai un problem que je n'arrive pas a resoudre, je voudrai appeler la methode "overrided" de la classe derivée depuis la 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
    23
    24
    25
    26
    27
    class Base{
    	public: 
    		void start(){
    			new thread(boost::bind(&Base::run, this));
    		}
     
    		void go(){
    			// do something
    		}
     
    }
     
     
    class Derived : public Base {
    	public:
    		void go(){
    			//do something different
    		}
    }
     
     
    int main(int argc, char** argv){
    	Derived* der = new Derived();
    	der->start();
     
    	return 0;
    }
    dans ce code j'obtient toujour le go() de la classe Base, ce que je veux c'est avoir le run() de la classe Derived, est-ce que c'est possible ?

    apparement c'est le boost bind qui pose probleme, vue que je lui passe Base::run en argument,

    merci d'avance pour votre aide.

    Cdlt

  2. #2
    Membre chevronné Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Par défaut
    en fait je ne pense pas que le problème vient de boost::bind, j'ai essayé ce code :
    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
    31
    class Base{
    	public: 
    		void start(){
    			new thread(boost::ref(*this));
    		}
     
    		void go(){
    			//do something.
    		}
     
    		void operator()(){
    			this->run();
    		}
     
    }
     
     
    class Derived : public Base {
    	public:
    		void go(){
    			//do something different
    		}
    }
     
     
    int main(int argc, char** argv){
    	Derived* der = new Derived();
    	der->start();
     
    	return 0;
    }
    et ça ne marche toujours pas !!

    une idée ?

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Et si tu essayais en mettant virtual devant void go(). C'est justement à cela que ca sert !!

    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 Base{
    	public: 
    		void start(){
    			new thread(boost::ref(*this));
    		}
    		
    		virtual void go(){
    			//do something.
    		}
    		
    		void operator()(){
    			this->run();
    		}
     
    }
    
    class Derived : public Base {
    	public:
    		virtual void go(){ // ici, le virtual n'est pas obligatoire mais c'est plus cohérent
    			//do something different
    		}
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre chevronné Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Par défaut
    salut ram-0000,

    desolé de ne pas l'avoir mentioné dans mes postes precedents, mais j'ai deja essayé avec le virtual, mais ça donne exactement le meme comportement !!

  5. #5
    Membre chevronné Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Par défaut
    salut tout le monde,

    le probleme a pris une autre tournure :
    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
    31
    32
    class Base{
    	public: 
    		void start(){
    			new thread(boost::bind(&Base::go, this));
    		}
     
    		virtual void go(){
    			// do something
    		}
     
                    string print(){
                           return "something";
                    }
     
    }
     
     
    class Derived : public Base {
    	public:
    		void go(){
    			//do something different
    		}
    }
     
     
    int main(int argc, char** argv){
    	Derived* der = new Derived();
    	der->start();
            std::cout << der->print();
     
    	return 0;
    }
    comme ça marche comme prevu, mais si j'enleve std::cout << der->print(); du main, ça ne marche pas !!!

    des idées ?

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Le virtual est indispensable !!!
    Là tu triches. Il faut mettre Base* pour avoir le polymorphisme !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc, char** argv){
        Base* der = new Derived();
        der->start();
            std::cout << der->print();
     
        return 0;
    }
    Et là ça va plus marcher du tout !!!!

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 16/10/2005, 20h21
  2. [MFC]creer une classe derivé de CWinThread
    Par psyjess dans le forum MFC
    Réponses: 2
    Dernier message: 18/03/2005, 14h23
  3. Réponses: 38
    Dernier message: 16/02/2005, 02h03
  4. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41
  5. [VB6]Enumérer les attributs et les méthodes d'une classe
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 04/05/2004, 18h34

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