OVH Cloud OVH Cloud

instanciation d'une classe de type inconnu ?

1 réponse
Avatar
Frédéric GOURUL
Bonjour, j'expose ce que j'aimerai pouvoir faire:

Une classe abstraite et une classe contenant un pointeur sur une dérivée de
cette classe.
Imaginons une class D dérivant de A, je voudrais, dans le constructeur de A,
créer une instance de la classe D (i.e. n'importe qu'elle classe dérivée de
A), classe dont je voudrais passer le type en paramètre du constructeur. De
plus, j'aimerai avoir une valeur par défaut...

class A
{
protected: A() {...}
public: virtual void foo() = 0;
};

class D : public A {...};

class B
{
private: A* mA;
public:
B(class A deriveeofA = D) // ligne invalide: type de la classe que je
veux instancier
{
mA = new deriveeofA(); // création d'une instance de la classe
}
};

Bon, je sais pas si tout ca est très clair... :)
Merci de vos réponses.

1 réponse

Avatar
Arnaud Debaene
Frédéric GOURUL wrote:
Bonjour, j'expose ce que j'aimerai pouvoir faire:

Une classe abstraite et une classe contenant un pointeur sur une
dérivée de cette classe.
Imaginons une class D dérivant de A, je voudrais, dans le
constructeur de A, créer une instance de la classe D (i.e. n'importe
qu'elle classe dérivée de A), classe dont je voudrais passer le type
en paramètre du constructeur. De plus, j'aimerai avoir une valeur par
défaut...

class A
{
protected: A() {...}
public: virtual void foo() = 0;
};

class D : public A {...};

class B
{
private: A* mA;
public:
B(class A deriveeofA = D) // ligne invalide: type de la classe
que je veux instancier
{
mA = new deriveeofA(); // création d'une instance de la classe
}
};

Bon, je sais pas si tout ca est très clair... :)
Merci de vos réponses.


On ne peut pas faire directement ce que tu veux en C++, mais on utilise
souvent l'idiome de "l'object factory" pour cela. En résumé, touts les
classes dérivées de A sont enregistrées aurpès d'un objet "fabrique" qui
sait quelle classe dérivée construire à partir d'un "identifiant de type"
(qui peut être une chaîne ou un aute identifiant unique).

Arnaud