Accueil > Forum > > > > Comment déclarer une interface en C++
Comment déclarer une interface en C++
jeudi 20 décembre 2007 à 11:25:55 |
Comment déclarer une interface en C++

Giles314
|
Bonjour, Ma question est quelque peu théorique car j'ai une solution mais qui ne me semble pas "pure". Ce que j'appelle une interface est une spécification sans code associé (virtuelle pure) par exemple class Interface { virtual int Run (void) = 0; virtual ~Interface () = 0;
}; Malheureusement une classe comme celle-ci ne se linke pas dans mon environnement gcc sous MinGW (mais je suppose que c'est vrai avec d'autres compilateurs). En effet si je déclare: class Implementation : public Interface { Implementation(); virtual int Run (void); virtual ~Implementation (); }; int main() { Implementation Programme; return Programme.Run(); }
Toute utilisation de Implementation va générer une référence à la fonction Interface::~Interface qui n'existe pas. Y a-t-il une solution à ce problème sans définir le destructeur (virtual ~Interface (){}) qui mettrait du code dans l'interface - certe pas beaucoup - qui perdrait ainsi son status d'interface pure ? Je sais je suis un peu tatillon, mais une interface c'est juste une interface 
|
|
jeudi 20 décembre 2007 à 18:13:32 |
Re : Comment déclarer une interface en C++

luhtor
|
Je n'ai jamais eu de problème avec le destructeur virtuel pure. Mais dans ton cas, ne pas déclarer le destructeur te poserait un problème ?
class Interface { virtual int Run (void) = 0; };
Mais pour revenir a ton problème, moi j'en vois un autre: -> ton constructeur n'est pas accessible car déclaré "private".
|
|
jeudi 20 décembre 2007 à 18:42:19 |
Re : Comment déclarer une interface en C++

Giles314
|
Effectivement il manque les public: Il faut considérer que toutes les déclarations de l'interface et de l'implementation le sont. Là n'est pas le problème.
Par contre il me faut effectivement obligatoirement un destructeur virtuel. Sinon si j'utilise mon implémentation comme décrit ci-dessous le destructeur de l'implémentation ne sera pas appelé. Il ne faut jamais interdire lors de la définition d'une interface que l'implémentation ait des destructeurs virtuels sinon on restreint considérablement soit les implémentations (pas de destructeur) soit les utilisations (pas d'utilisation polymorphique ce qui réduit considérablement l'intéret d'une interface!).
int main() { Implementation *Programme = new Programme; int Result = Programme.Run(); delete Programme; return Result; }
|
|
jeudi 20 décembre 2007 à 18:44:09 |
Re : Comment déclarer une interface en C++

Giles314
|
Ouuups il fallais évidement lire ceci:
int main() { Interface *Programme = new Implementation; int Result = Programme.Run(); delete Programme; return Result; }
|
|
jeudi 20 décembre 2007 à 20:36:31 |
Re : Comment déclarer une interface en C++

juju12
|
Bon...mais pourquoi ne veux-tu pas implémenter le destructeur de Interface? Tu peux le mettre en inline avec rien dedans par exemple : class Interface { virtual int Run (void) = 0; virtual ~Interface () = 0 {return;}; };
de cette manière tu gardes le destructeur comme fonction virtuelle pure, mais il est tout de même implémenté pour l'interface; de toutes façons le compilateur virera l'appel puisqu'il ne fait rien.
|
|
jeudi 20 décembre 2007 à 20:53:08 |
Re : Comment déclarer une interface en C++

luhtor
|
Oui en effet, au temps pour moi, pour le coup du destructeur. J'essai de voir, car je suis intrigué par ce problème. J'ai essayé sous devcpp, j'ai le meme soucis.
Bon, mais j'ai cherché autour de moi, la réponse, c'est qu'apparemment, on ne peut pas faire ce que tu souhaites avec le C++. Donc le problème vient de ta conception. Tu ne peux pas gérer une interface comme un objet et donc on ne peut pas détruire une interface. Donc l'objet Implementation doit être détruit par celui qui a créé ton objet.
|
|
jeudi 20 décembre 2007 à 20:57:30 |
Re : Comment déclarer une interface en C++

luhtor
|
Non Juju12, car dans ton cas, la classe Interface n'est plus une interface et chaque objet de type Interface* possède une vtable, et donc Giles314 aura de gros ennui plus tard s'il commence a faire de l'héritage multiple à cause de l'héritage multiple. Sauf si dans la structure du programme de Giles314, l'héritage multiple ne présente pas de pb.
|
|
jeudi 20 décembre 2007 à 23:53:03 |
Re : Comment déclarer une interface en C++

yann_lo_san
|
Salut,
Pour l'héritage multiple il faut déclarer la dérivation viruelle :
class Implementation : virtual public Interface { };
|
|
vendredi 21 décembre 2007 à 00:32:53 |
Re : Comment déclarer une interface en C++

Giles314
|
Je ne vois pas bien à quoi l'héritage multiple pourrait être une solution au problème. J'ai un peu peur que Luthor ait raison et qu'on ne puisse par faire une interface pure en C++. C'est aussi vers cette conclusion que mes essais m'avaient conduit. Mais j'ai du mal à m'y résoudre car le concept d'interface est quand même un pilier de la conception objet et je n'imagine pas que les travaux de normalisation du C++ n'ait pas ouvert la possibilité de créer une interface pure. Mais il est vrai qu'en autorisant l'implémentation d'une méthode virtuelle pure le C++ permet une ineptie totalement inutile mais qui semble interdire d'implémenter proprement un concept de base.
Sinon la proposition de Juju12 est correcte et correspond à la façon dont j'approche aujourd'hui au plus près le concept d'interface (sauf que perso je ne mets même pas le return dans le destructeur car les accolades suffisent). Si bien qu'on obtient ce que Luthor dit ne pas être possible (et effectivement j'aimerai ne pas le faire) c'est à dire "gérer une interface comme un objet" et fournir une méthode pour "détruire une interface."
|
|
vendredi 21 décembre 2007 à 08:20:48 |
Re : Comment déclarer une interface en C++

luhtor
|
"C++ permet une ineptie totalement inutile mais qui semble interdire d'implémenter proprement un concept de base." => Il ne l'interdit pas. Mais une interface n'est pas faite pour etre détruite. Elle ne décrit qu'un aspect fonctionnel de l'objet et elle ne peut être considérée comme l'objet lui meme. Donc ce n'est pas le C++ qui interdit de le faire, mais la théorie qui dirait que : détruire une interface n'a pas de sens et ne résulte que d'une mauvaise conception.
|
|
Cette discussion est classée dans : int, interface, virtual, implementation, pure
Répondre à ce message
Sujets en rapport avec ce message
DLL : interface IUnknown en C [ par Mastersam ]
Bonjour, je créé actuellement en driver ASIO sous forme de DLL, j'ai eu un exemple général de création d'un driver dans la SDK ASIO 2.2, mais tout est
multi heritage [ par foxz ]
Bonjour,d'une maniere general.class strm{ // base stream virtual int w(void*,int)=0; // write virtual int r(void*,int)=0; //read};class fil:virtual pu
affiche une image sur mon interface [ par ribh ]
pour afficher une image j'ai fait ce petit code: int main(int argc, char* argv[]) { QApplication app(argc, argv); QLabel label; //on donn
Ma première sérialisation d'objet [ par jex0519 ]
Bonjour à tous,Je suis débutant en c++, et j'ai un projet ou je dois sauvegarder mes objets afin de pouvoir les recharger après...<br
Interface d'un sudoku sous Gtkmm [ par Jedi_Yoda ]
Je cherche a faire afficher dans les 81 labels le "int" resolu qui lui correpond. Mais le set_label(param) n'accepte que les parametres de types "ustr
blocage interface utilisateur [ par totoscill ]
Bonjour,Je développe une application me permettant de piloter un outil avec labwindows CVI 8.5. J'utilise une interface utilisateur et une boucle whil
Utilisation d' interfaces en C++ [ par zaraki21 ]
Bonjour, je suis actuellement en stage et je dois poursuivre le développement d'une application C++ qui utilise un mécanisme d'interfaces et, je me he
upload sur ftp via sockets [ par zod331 ]
bonjour, J'ai un petit problème lors de l'envoi de mon fichier. Le fichier est bien envoyé sur le serveur mais il y a rien dedans Quelqu'un a une sol
Programme C algorithme de Hough [ par Waouuu ]
Bonjour, je suis actuellement en échange au Japon et dans mon labo mon prof m'a donné a programmer la transformée de Hough pour detecter les lignes de
Gestion dynamique de la mémoire [ par totolfpn ]
Bonjour, j'apprends le C en autodidacte et je bloque sur strcmp et les pointeurs. Mon code marche bien sans pointeur, mais il y a un truc qui m'échapp
Livres en rapport
|
Derniers Blogs
COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
ERREUR DE POINTEURERREUR DE POINTEUR par africanwinners
Cliquez pour lire la suite par africanwinners
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|