Fonction pure virtuelle et classe abstraite
Bonjour,
Je me forme à l'utilisation des fonction virtuelles pure.
Je part du code suivant trouvé sur le net qui compile et fonctionne très bien:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <iostream>
class A {
public:
virtual void action() = 0;
};
class B : public A {
public:
void action() {
std::cout << "action" << std::endl;
}
};
class MyClass {
public:
static void setInstance(A *newInstance) {
instance = newInstance;
}
private:
MyClass();
static A *instance;
};
A *MyClass::instance = 0;
int main(int argc, char** argv) {
B myInstance;
MyClass::setInstance(&myInstance);
myInstance.action();
return 0;
} |
J'aimerais maintenant ajouter un 'getter' getInstance dans la classe MyClass permettant d'instancier une classe A si la variable instance est nulle.
Ce qui donne le code suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <iostream>
class A {
public:
virtual void action() = 0;
};
class B : public A {
public:
void action() {
std::cout << "action" << std::endl;
}
};
class MyClass {
public:
static void setInstance(A *newInstance) {
instance = newInstance;
}
static A& getInstance() {
static A newInstance;
if (!instance)
instance = &newInstance;
return *instance;
}
private:
MyClass();
static A *instance;
};
A *MyClass::instance = 0;
int main(int argc, char** argv) {
B myInstance;
MyClass::setInstance(&myInstance);
myInstance.action();
return 0;
} |
Je ne sais pas comment résoudre le problème de compilation suivant :
g++ -o test test.cpp
test.cpp: In static member function ‘static A& MyClass::getInstance()’:
test.cpp:26:22: erreur: cannot declare variable ‘newInstance’ to be of abstract type ‘A’
test.cpp:3:7: note: because the following virtual functions are pure within ‘A’:
test.cpp:5:22: note: virtual void A::action()
La fonction action est définie dans la classe B.
Qu'en pensez vous ?
Merci par avance.