2011-10-24 3 views
5

Si j'ai une interface et de nombreuses classes qui implémentent cette interface, puis-je maintenant passer en argument uniquement le type de la classe et non l'objet?Type de classe C++ en tant qu'argument

quelque chose comme ceci:

Interface *creatClass(class : Interface){ 
    return new class(); 
} 

EDIT:

template <class T> 
IFrame *creatClass(){ 
    return new T(); 
} 

void dfg(){ 
    IFrame *lol = creatClass<Button>(); 
} 

error C3206: 'creatClass' : invalid template argument for 'Dist_Frame', missing template argument list on class template 'Button' 

PS. Button hérite IFrame

Répondre

12

Il s'appelle "Template".

template <class T> 
T *creatClass(){ 
    return new T(); 
} 

Vous devrez l'appeler ainsi:

class InterfaceImpl : public Interface {...}; 
// ... 
InterfaceImpl *newImpl = creatClass<InterfaceImpl>(); 

modifié

Vous pouvez également essayer, pour vous assurer que créer des instances de Interface:

template <class T> 
Interface *creatClass(){ 
    return new T(); 
} 

modifier à votre modifier

J'ai essayé ce code de test:

#include <iostream> 
using namespace std; 

class IFrame{ 
    public: 
     virtual void Create() =0; 
}; 

class Button : public IFrame{ 
    public: 

     virtual void Create(){ cout << "In Button" << endl;}; 
}; 

template <class T> 
IFrame *creatClass(){ 
    return new T(); 
} 


int main() 
{ 
    IFrame *lol = creatClass<Button>(); 
    lol->Create(); 
} 

fonctionne exactement comme prévu. Vous devez avoir d'autres erreurs de codage dans vos définitions de classe. Débogage, ça n'a rien à voir avec ta question originale.

+0

regardez la modification – Vladp

+0

@vladp - regardé. – littleadv

Questions connexes