zaraki21
Messages postés31Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention22 avril 2011
-
11 févr. 2010 à 14:13
dragonjoker59
Messages postés92Date d'inscriptionsamedi 26 mars 2005StatutMembreDernière intervention23 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.
dragonjoker59
Messages postés92Date d'inscriptionsamedi 26 mars 2005StatutMembreDernière intervention23 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
zaraki21
Messages postés31Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention22 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".
zaraki21
Messages postés31Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention22 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 ?
dragonjoker59
Messages postés92Date d'inscriptionsamedi 26 mars 2005StatutMembreDernière intervention23 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