Oui, il est possible, et en fait il est nécessaire d'utiliser des pointeurs si vous souhaitez que votre vecteur contienne des objets d'une hiérarchie de classe entière plutôt que d'un seul type. (Ne pas utiliser les pointeurs entraînera le redouté problème de object slicing - tous les objets sont convertis silencieusement en type de classe de base.Cela n'est pas diagnostiqué par le compilateur, et n'est certainement pas ce que vous voulez.)
class c
{
void virtual func();
};
class sc:public c
{
void func(){cout<<"using func";}
};
sc cobj;
vector<c*> cvect; // Note the type is "c*"
cvect.push_back(&cobj); // Note the "&"
vector<c*>::iterator citer;
for(citer=cvect.begin();citer != cvect.end();citer++) // Use "!=" not "<"
{
(*citer)->func();
}
Notez que avec un vecteur de pointeurs, que vous devez faire votre propre gestion de la mémoire, soyez donc très prudent - si vous utilisez des objets locaux (comme ci-dessus), ils ne doivent pas tomber de portée avant le conteneur. Si vous utilisez des pointeurs vers des objets créés avec new
, vous devrez les delete
manuellement avant la destruction du conteneur. Vous devez absolument envisager d'utiliser des pointeurs intelligents dans ce cas, tels que le smart_ptr
fourni par Boost
.
func() est une fonction virtuelle, donc je suppose que vecteur de pointeurs est nécessaire ici. – Naveen
ah oui - bon point –
Et si push_back() jette, vous voulez probablement éviter de fuir le nouveau c. – bk1e