Sì, è possibile, ed è infatti necessario utilizzare i puntatori se si desidera che il vettore contenga oggetti da un'intera gerarchia di classi anziché da un singolo tipo. (Se non si utilizzano i puntatori, si verificherà il temuto problema di object slicing - tutti gli oggetti vengono convertiti automaticamente in un tipo di classe base, che non viene diagnosticato dal compilatore e quasi certamente non è ciò che si desidera.)
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();
}
Si noti che con un vettore di puntatori, è necessario fare la propria gestione della memoria, in modo da essere molto attenti - se si prevede di utilizzare oggetti locali (come sopra), non devono cadere di portata prima che il contenitore faccia. Se si utilizzano puntatori su oggetti creati con new
, sarà necessario eseguire manualmente delete
prima che il contenitore venga distrutto. È assolutamente necessario prendere in considerazione l'utilizzo di indicatori intelligenti in questo caso, ad esempio smart_ptr
fornito da Boost
.
fonte
2009-05-03 15:10:15
func() è una funzione virtuale, quindi suppongo che sia necessario il vettore di puntatori. – Naveen
ah sì - buon punto –
E se si spinge push_back(), probabilmente si vuole evitare di perdere il nuovo c. – bk1e