2010-08-13 7 views
1

Je souhaite appeler le constructeur;Appel du constructeur des enfants inconnus

class anAbstractClass 
{ 
public: anAbstractClass(inputdatatype){/*blablabla*/} 
}; 

class aChield : public anAbstactClass 
{ 
/* 
... 
*/ 
} 

void _engine::initShader(_anAbstractClass** inShader) 
{ 
    *inShader = new /*???*/(inputdata for the construcor) 
} 

aChield* theChield; 
_engine* myEngine = new _engine(); 
myEngine->initShader(&theChield); 

Alors, comment puis-je appeler le constructeur au/??? /? Thx en avance pour les réponses!

+0

Essayez-vous d'implémenter le modèle de méthode d'usine? –

Répondre

1

Bonne idée, mais il n'y a pas de support pour obtenir le type exact d'un pointeur à l'exécution.

Dans votre méthode initShader, inShader est de type anAbstractClass** et il n'y a pas moyen d'obtenir les informations qu'il était un pointeur vers pointeur vers une classe dérivée avant l'appel de méthode.

Donc, vous avez besoin de changer votre code, peut-être que vous pouvez utiliser une usine ou quelque chose comme ça.

+0

D'accord, je suis triste un peu: '( Mais, je dois regarder à oodesign.com THX pour ensuite 2 réponses.C'est un site cool! :) –

2

Vous ne pouvez pas faire cela. Comment initShader va savoir quel constructeur enfant appeler, alors que tout ce qu'il sait est la classe de base?

Ce que je pense que vous voulez ici, est une fonction templated:

template <typename T> 
void _engine::initShader(T ** inShader) 
{ 
    *inShader = new T(inputdata for the construcor) 
} 
+1

Je le tapais comme vous l'avez posté. –

+0

Im curieux, comment puis-je faire ainsi, que l'utilisateur peut utiliser le initShader seulement avec l'anAbstractClass (et ses enfants)? –

+0

@ User408 ...: après le nouveau, appelez 'inShader-> SomeFunctionDefinedInanAbstractClass()'. Vous obtiendrez une erreur de compilation si l'objet n'a pas cette fonction. –