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 :

Pointeur sur méthode + héritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 12
    Par défaut Pointeur sur méthode + héritage
    Bonjour,

    j'ai une classe mère d'interface comme suit (je ne garde que la partie qui nous intéresse) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    namespace ZenZiAPI
    {
    class IModule
    {
    public:
    typedef bool (IModule::*p_callback)(ITools&);
    }
    }
    et une classe fille avec 2 méthode comme suit (les méthode sont simplifiées):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bool ModulePHP::GetPHP(Tools &_EOTools)
    {
    return (true);
    }
     
    const std::vector<std::pair<ZenZiAPI::IModule::p_callback, ZenZiAPI::hookPosition>>& ModulePHP::getCallbacks()
    {
    this->_LPHook.first = static_cast<ZenZiAPI::IModule::p_callback>(&ModulePHP::GetPHP);
    }
    L'erreur se situe sur la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static_cast<ZenZiAPI::IModule::p_callback>(&ModulePHP::GetPHP);
    Erreur Compilo :

    Error 4 error C2440: 'static_cast' : cannot convert from 'bool (__thiscall ModulePHP::* )(Tools &)' to 'ZenZiAPI::IModule::p_callback'

    J'ai passer la journée dessus je vois pas comment résoudre ce problème

    Est ce que quelqu'un saurait pourquoi ?

    merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut
    Bonjour
    Pourrais tu expliqué exactement ce que tu veux faire ?
    Je pense qu en utilisant simplement le polymorphisme on peut resoudre ton probleme.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 12
    Par défaut
    Pour la petite histoire c'est un serveur web.

    Je dois faire plusieurs modules héritant obligatoirement de cette interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    namespace ZenZiAPI
    {
      class IModule
      {
      public:
        typedef bool (IModule::*p_callback)(ITools&); /**< callbacks typedef */
        virtual ~IModule() {};
        virtual const std::vector<std::pair<p_callback, hookPosition> >& getCallbacks() = 0;
        virtual bool	onLoad(void) = 0;
        virtual void	onUnLoad(void) = 0;
      };
    }
    #endif //_IMODULE_H_
    Ces modules seront des DLL présentées comme cela (voici un exemple de module PHP) :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #include "ModulePHP.h"
     
    ModulePHP::ModulePHP() {}
     
    ModulePHP::~ModulePHP() {}
     
    bool				ModulePHP::GetPHP(Tools &_EOTools)
    {
    	return true;
    }
     
    bool ModulePHP::onLoad()
    {
    	std::cout << "Module PHP Load" << std::endl;
    	return (true);
    }
     
    void ModulePHP::onUnLoad()
    {
    	std::cout << "Module PHP Unload" << std::endl;
    }
     
    const std::vector<std::pair<ZenZiAPI::IModule::p_callback, ZenZiAPI::hookPosition>>& ModulePHP::getCallbacks()
    {
    /*!!!!*/	this->_LPHook.first = static_cast<ZenZiAPI::IModule::p_callback>(&ModulePHP::GetPHP);
    	this->_LPHook.second = ZenZiAPI::hookPosition::LAST;
    	this->_LVPair[3].push_back(this->_LPHook);
     
    	return *this->_LVPair;
    }
     
    extern "C" DLL_EXPORT ZenZiAPI::IModule *create()
    {
    	ModulePHP		*_LOModulePHP = new ModulePHP();
    	std::cout << "ModulePHP Destroy Method" << std::endl;
    	return (static_cast<ZenZiAPI::IModule*>(_LOModulePHP)); 
    }
     
    extern "C" DLL_EXPORT void destroy(void* p) 
    {
    	std::cout << "ModulePHP Create Method" << std::endl;
    	delete (static_cast<ModulePHP*>(p)); 
    }
    La gestion de tout ces modules coté serveur se fait aussi à l'aide d'une API qui m'impose un modèle de conception, le cast que je souhaite faire est un pointeur sur méthode de type IModule que je souhaite stocké dans une map coté serveur.

    Afin d'appeler les modules dans le code en utilisant leur méthode d'entrée que j'aurai défini (mais qui ne compile pas) et leur instance récupérée au préalable.

    Ces module seront chargés à chaud à l'aide de LoadLibrary et GetProcAddress.

    Je ne peu malheureusement pas utilisé de polymorphisme car coté serveur l'appel aux méthode des modules se fait à l'aide d'un vecteur de pair défini comme tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<std::pair<ZenZiAPI::IModule::p_callback, ZenZiAPI::hookPosition>>

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Faut faire un reinterpret_cast

    J'avais eu le même soucis, et c'est tout ce que j'ai trouvé

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut
    Bonjour
    Je pense que ça pourra t'aider

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    class ITools
    {
    	public:
     
    };
     
    class CToolsImpl : public ITools
    {
    	public:
     
    };
     
     
     
    class IModule
    {
    	public:
    		typedef bool (IModule::*p_callback)(ITools&);
    		virtual IModule::p_callback getCallbacks() const =0;
    };
    class ModulePHP: public IModule
    {
    	public :
     
    		bool ModulePHP::GetPHP(ITools &_EOTools)
    		{
    			return (true);
    		}
    		virtual IModule::p_callback getCallbacks() const
    		{
    			return static_cast<IModule::p_callback>(&ModulePHP::GetPHP);
    		}
     
    };
    #define callMemberFunction(object,ptrToMember)  ((object).*(ptrToMember))
     
     
    int main(int argc, char* argv[])
    {
    	ITools* tools = new CToolsImpl();
     
    	IModule* module = new ModulePHP();
    	IModule::p_callback pm =module->getCallbacks();
    	callMemberFunction(*module,pm)(*tools);
    }

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Tiens t'as réussit avec un static_cast ?


    J'vais le tenter,

    merci

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

Discussions similaires

  1. pointeurs sur méthode
    Par didierBB dans le forum C++
    Réponses: 10
    Dernier message: 06/10/2012, 18h08
  2. Pointeur sur méthode + erreur C2064
    Par Bleastou dans le forum C++
    Réponses: 2
    Dernier message: 22/09/2008, 15h55
  3. Pointeur sur méthode membre
    Par FunkyTech dans le forum C++
    Réponses: 10
    Dernier message: 13/05/2008, 10h02
  4. [POO] Pointeur sur fonction membre et héritage
    Par MrDuChnok dans le forum C++
    Réponses: 9
    Dernier message: 20/07/2006, 17h19
  5. Pointeur de fonctions sur méthode
    Par Glosialabolas dans le forum C++
    Réponses: 9
    Dernier message: 04/12/2005, 14h55

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