2012-10-21 4 views
2

Par exemple, nous avons une classe Animal, et nous avons créé une autre classe telle que la classe Lion, la classe Tiger, etc. J'ai fait une liste de la classe Animal et je veux transposer la liste et traiter la liste en fonction du type de la classe de chaque membre de la liste.Comment vérifier le type d'objet en C++

Class Animal 
Class Tiger :: public Animal{} 
Class Lion :: public Animal{} 
list<Animal> l; 
Tiger T; 
Lion L; 
l.push_back(T); l.push_back(L); 
if the top member of the list is Tiger print"ITs a tiger" 
else print"something" 

Simplement, je veux vérifier le type de l'instance créée. Je ne sais pas comment le faire.

+0

Si vous voulez vérifier le type de votre conception semble faux et vous devriez envisager de le revoir.Pour connaître le type, vous pouvez utiliser 'typeinfo' de' dynamic_cast'. –

+1

liste est faux pour cela, en raison de problème de tranchage http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c –

+1

Vous devez revoir la conception. Ce dont vous avez probablement besoin, ce sont des méthodes virtuelles. Une extension à ceci est le modèle de visiteur. –

Répondre

2

Ceci est appelé RTTI et ce n'est pas une bonne pratique de codage.

Cela dit, si vous voulez absolument savoir un type de classe, vous pouvez le faire

if (typeid(myanimal) == typeid(Tiger)) { 
    // Do something tiger-like 
} 

Ce que je recommande dans votre cas est d'avoir une interface commune à tous Animal, par exemple un sayHello() méthode. Vous avez

class Animal { 
    void sayHello() = 0; 
    // Other things 
} 

En Tiger ce serait

Tiger::sayHello() { 
    cout << "Hello I'm a Tiger!" << endl; 
} 

Puis, à partir de votre vector<Animal*> (vous devez utiliser des pointeurs) il suffit d'appeler

myAnimal->sayHello(); 
+0

vecteur simplement stocker les animaux et ne peut pas tenir ex. Tigre. Vous devez le stocker comme une structure comme ptr –

+0

Je me suis rendu compte que quelques secondes après la publication, j'ai déjà édité :) – alestanis

+0

S'il vous plaît pas de vecteur de pointeurs. Il n'y a pas de sémantique de propriété pour les pointeurs. –

2

Vous pouvez vérifier le type (typeid), oui, mais vous n'avez pas besoin.

Vous pouvez simplement contenir un std::list<std::unique_ptr<Animal> > et avoir une méthode virtual dans Animal. De cette façon, vous profitez du polymorphisme.

class Animal 
{ 
public: 
    virtual void print() = 0; 
}; 
class Tiger : Animal 
{ 
    virtual void print() { std::cout << "I'm a tiger"; } 
}; 

Animal* pA = new Tiger; 
pA->print(); // prints tiger 
0

utilisez dynamic_cast et vérifiez si le résultat est valide. Mais !!!!!!! Vous c'est généralement une mauvaise pratique: dans votre cas, il est préférable dans la classe de base de déclarer la fonction virtuelle virtual std :: string printMe() const = 0; et l'implémenter dans chaque classe.

Questions connexes