Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3092 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Cacher l'implémentation d'une interface

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Cacher l'implémentation d'une interface

n°2017237
Riot
Buy me a riot
Posté le 16-08-2010 à 16:16:43  profilanswer
 

Hello,
 
J'ai une classe qui encapsule du Boost.Asio pour faire de la comm série.
J'ai des méthodes readAsync et writeAsync. Je voudrais pouvoir donner en paramètre de ces méthodes une callback (ou assimilé) pour que l'appelant soit averti lorsqu'un read/write s'est déroulé.
Le truc c'est que je veux que l'interface de ma classe reste clean, c'est-à-dire sans aucun include de Boost.
 
En gros je veux un truc comme ça :

Code :
  1. void handler()
  2. {
  3.   std::cout << "duh!" << std::endl;
  4. }
  5. int main(...)
  6. {
  7.   SerialComm serial;
  8.   ...
  9.   serial.asyncRead( &handler );
  10.   ...
  11.   return 0;
  12. }


 
Vous voyez un moyen ?


---------------
Be the one with the flames.
mood
Publicité
Posté le 16-08-2010 à 16:16:43  profilanswer
 

n°2017266
Un Program​meur
Posté le 16-08-2010 à 17:42:30  profilanswer
 

pimpl idiom?


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2017706
Taz
bisounours-codeur
Posté le 18-08-2010 à 15:28:00  profilanswer
 

aka Cheshire Cat :D
 
De toutes façons, tu fais bien de planquer l'implémentation histoire de ne pas tirer Boost à chaque fois que tu vas inclure "tontruc.h".
Ce qui va peut-être t'ennuyer un peu c'est si le truc que tu veux planquer est template.
 

Code :
  1. // .hpp                                                                                                                                                                                               
  2. #include <memory>
  3. namespace My
  4. {
  5.   class SerialComm
  6.   {
  7.     struct SerialCommeImpl;
  8.     std::auto_ptr<SerialCommeImpl> *pimpl;
  9.   public:
  10.     SerialComm();
  11.     void asyncWrite(...);
  12.   }
  13. }
  14. // .cpp                                                                                                                                                                                               
  15. #include <iostream>
  16. namespace My
  17. {
  18.   struct SerialComm::SerialCommImpl
  19.   {
  20.     void asyncWrite(...)
  21.     {
  22.       // ...                                                                                                                                                                                         
  23.     }
  24.   };
  25.   SerialComm::SerialComm()
  26.     : pimpl(new SerialCommImpl)
  27.   { }
  28.   void SerialComm::asyncWrite(...)
  29.   {
  30.     this->pimpl->asyncWrite(...);
  31.   }
  32. }

n°2017708
Un Program​meur
Posté le 18-08-2010 à 15:35:44  profilanswer
 

alias compilation firewall.  pimpl est le nom chez Sutter si j'ai bonne memoire, mais les deux autres sont plus anciens.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2017744
Riot
Buy me a riot
Posté le 18-08-2010 à 17:31:21  profilanswer
 

Taz a écrit :

aka Cheshire Cat :D
 
De toutes façons, tu fais bien de planquer l'implémentation histoire de ne pas tirer Boost à chaque fois que tu vas inclure "tontruc.h".
Ce qui va peut-être t'ennuyer un peu c'est si le truc que tu veux planquer est template.


C'est exactement ça. Au départ ma méthode asyncWrite() était une fonction template :
 

Code :
  1. template< typename Handler >
  2. void asyncWrite( const unsigned char* pData, unsigned int dataSize, Handler handler );


 
Et du coup je me suis retrouvé coincé car j'aurais été obligé de mettre la définition dans le .h :

Code :
  1. {
  2. p_private->m_serial.async_read_some( boost::asio::buffer( pData, dataSize ),
  3.  boost::bind( &SerialComm_p::readCompleted, p_private, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, handler ) );
  4. }


 
Du coup j'imagine que le seul moyen de me dépatouiller avec la callback est d'utiliser un void*, non ?
 

Code :
  1. void asyncWrite( const unsigned char* pData, unsigned int dataSize, void* cb );


---------------
Be the one with the flames.
n°2017745
Un Program​meur
Posté le 18-08-2010 à 17:39:51  profilanswer
 

Cherche type erasure; je ne sais pas si ca vaut la peine de mettre en oeuvre dans ce cas. (Un exemple de la technique dans un autre contexte: http://stackoverflow.com/questions [...] 8#1278328)


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2017759
theshockwa​ve
I work at a firm named Koslow
Posté le 18-08-2010 à 19:10:54  profilanswer
 

Riot a écrit :

Du coup j'imagine que le seul moyen de me dépatouiller avec la callback est d'utiliser un void*, non ?


void * != void (*)()


---------------
last.fm
n°2017763
Un Program​meur
Posté le 18-08-2010 à 19:23:53  profilanswer
 

Il n'y a pas d'équivalent à void* pour les fonctions (void (*)() c'est un pointeur vers une fonction sans argument et retournant void).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2018083
Taz
bisounours-codeur
Posté le 20-08-2010 à 08:55:13  profilanswer
 

Tu peux typer ton Handler en boost::function peut-être ?

n°2018091
Riot
Buy me a riot
Posté le 20-08-2010 à 10:06:50  profilanswer
 

Bah du coup ça obligerait l'appelant à inclure Boost.


---------------
Be the one with the flames.
mood
Publicité
Posté le 20-08-2010 à 10:06:50  profilanswer
 

n°2018098
theshockwa​ve
I work at a firm named Koslow
Posté le 20-08-2010 à 10:31:41  profilanswer
 

Un Programmeur a écrit :

Il n'y a pas d'équivalent à void* pour les fonctions (void (*)() c'est un pointeur vers une fonction sans argument et retournant void).


certes, mais pour une question de cohérence, si je ne m'abuse, un pointeur sur donnée et un pointeur sur fonction n'ont pas de rapport. direct Il me semble même que, dans certains cas, il se pourrait qu'ils ne fassent pas la même taille. Je vàoulais juste insister sur le fait qu'il faut tyyper le pointeur selon l'appel qui sera effectué plutôt qu'avoir un void*


---------------
last.fm

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Cacher l'implémentation d'une interface

 

Sujets relatifs
Pb de méthode virtuelle sur Interface[résolu] Implémentation des lecteurs/écrivains
[PERL?] interface texte avec gestion des touches directionnellesC# obtenir l'IP d'une interface spécifique par son nom "window"
look ou bibliothéque d'interface builder c++perl Net::Telnet : comment choisir l'interface ?
Programmation Interface Graphique pour Ecran TactilePourquoi ça compile pas ? Iterable<Interface> ?
[Swing/Netbeans] Problème pour organiser l'interfaceSondage web : LE GPGPU, quelle implémentation actuelle ? (Thèse)
Plus de sujets relatifs à : Cacher l'implémentation d'une interface


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR