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
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
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
polymorphisme compliqué [ par rajaspera ]
Bonjour, j'ai un problème qui me bloque depuis 48 heures, j'ai décidé de finalement vous soumettre la question : pour la figure suivante : mes clas
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
c++ [ par chlock ]
bonjour,étant debutant je souhaiterait de laide pour mené a bien mon projet le tout en procédure ajout,supp.... en utilisant voidje sui débutant donc
Objet : ajout et taille [ par scorpion077 ]
Bonjour,j'essai de corriger un DS portant sur la POO. voici mon code:--------------------------------------------------------------------------------#
Livres en rapport
|
Derniers Blogs
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Forum
ARBRE BINAIREARBRE BINAIRE par pacotheking
Cliquez pour lire la suite par pacotheking
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|