Utilisation d' interfaces en C++

zaraki21 Messages postés 31 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 22 avril 2011 - 11 févr. 2010 à 14:13
dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015 - 12 févr. 2010 à 16:20
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 heurte
depuis peu à une erreur de compilation.
Je vous explique la situation :
J'ai un premier fichier A.h :
class A {
public :
A();
virtual ~A();
virtual fonction1(int a, int b, int c)=0;
virtual fonction2(int a, int b, int c)=0;
};

Puis un autre fichier B.h :
#include "A.h"
class B {
public :
B();
virtual ~B();
static B* getInstance();

fonction1(int a, int b, int c);
fonction2(int a, int b, int c);

private :
static B* m_instance;
}

Dans le fichier associé B.cpp, je tente de définir la méthode getInstance() comme ceci :
B* B::getInstance(){
if(m_instance==NULL){
m_instance=new B();
}
return m_instance;
}

Seulement voila, j'ai une erreur à la ligne (1),"cannot allocate an object of abstract type 'B'", et je ne sais pas comnent la résoudre donc si vous avez une idée,
je suis preneur.
Merci.

6 réponses

dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015
12 févr. 2010 à 09:48
Dans ta classe B, tu as oublié les 'virtual' pour tes fonctions 1 et 2, normalement, ça devrait corriger ton problème.
0
dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015
12 févr. 2010 à 09:50
Désolé pour le flood, mais ces 2 fonctions, 1 et 2, n'ont pas de type de retour ... ton compilateur doit te crier dessus aussi, pour ça, ou au moins te mettre un warning
0
zaraki21 Messages postés 31 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 22 avril 2011
12 févr. 2010 à 11:33
En fait le fait de rajouter les "virtual" n'a pas corrigé l' erreur de compilation. La fonction getInstance() n'utilise pas une des fonctions déclarées dans la classe de base donc, je sais pas. Sinon mes fonctions ont bien un type de retour qui est "unsigned char".
0
dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015
12 févr. 2010 à 15:02
Ah, en fait ta classe B n'étend pas A, il faut faire ceci :
class B : public A
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zaraki21 Messages postés 31 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 22 avril 2011
12 févr. 2010 à 15:36
J'ai fait aussi ça et ça ne fonctionne toujours pas. Mais Il y a une autre question que je me pose qui pose aussi peut être quelques problemes. En fait, j' utilise une autre classe, classe C qui étend A aussi. Le truc c'est que dans A j'ai declaré les fonctions de B et de C mais B par exemple ne va pas redéfinir les methodes de C. Genre, j'ai ceci :
Dans A :
virtual int fonction1(int a, int b, int c)=0;
virtual int fonction2(int a, int b, int c)=0;
virtual int fonction3(int a, int b, int c)=0;
virtual int fonction4(int a, int b, int c)=0;

Dans B, je vais redéfinir le comportement des fonctions 1 et 2 et, dans C, celui des fonctions 3 et 4. Ca te parait bon?
Et sinon faut-il que je fasse un fichier A.cpp avec le constructeur et destructeur de A vides ?
0
dragonjoker59 Messages postés 92 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 23 septembre 2015
12 févr. 2010 à 16:20
ben c'est normal à ce moment là !
Il faut que dans B tu fasses :
virtual int fonction3(int a, int b, int c){} 
virtual int fonction4(int a, int b, int c){} 


et dans c :
virtual int fonction1(int a, int b, int c){} 
virtual int fonction2(int a, int b, int c){} 


En fait les fonctions virtuelles 3 et 4 n'étant pas définies dans B, tu ne peux pas instancier B, de même pour C avec les fonctions 1 et 2, donc il faut les implémenter à vide, comme ça elles sont au moins définies, et les 2 classes B et C sont instanciables.
De manière générale, pour instancier une classe dérivant d'une interface (classe virtuelle), il faut que toutes les fonctions de l'interface déclarées comme étant égales à 0 soient implémentées
0