2011-02-23 7 views
7

Ho una classe denominata ABC che ha un modello di classe:C++ utilizzando puntatori a modello oggetti

template <class T> class ABC{} 

In un'altra classe che sto cercando di vendite di oggetti ABC in un elenco:

class CDE{ 
private: 
    list<ABC *> some_list; 
} 

Intendo memorizzare oggetti di ABC che potrebbero avere parametri di modello di classe diversi. È necessario specificare il modello anche per un puntatore al momento della compilazione? Cosa succede se il contenitore deve memorizzare oggetti di diverso tipo? Non è possibile?

risposta

7

E 'necessario specificare modello anche per un puntatore al momento della compilazione?

Sì.

Cosa succede se il contenitore deve memorizzare oggetti di diverso tipo? Non è possibile?

Non è (direttamente) possibile.

Non esiste una cosa come la classe ABC. Esistono solo le istanze di ABC, ad esempio ABC<Foo> e ABC<Bar>. Queste sono classi completamente diverse.

Si può fare qualcosa di simile:

template<typename T> 
class ABC : public ABC_Base 
{ 
    ... 
} 

list<ABC_Base*> some_list; 

In questo modo, tutte le istanze di ABC hanno un tipo di base comune, e si può usare un puntatore base arbitrariamente.

+0

Questo sembra abbastanza ragionevole, con un piccolo svantaggio. L'intera ragione per usare i modelli era assicurarsi che gli oggetti fossero strettamente accoppiati. In questo modo c'è ancora la possibilità di creare oggetti di ABC_Base (o delle sue classi derivate) senza tipo di template e usarli nella lista. – cyrux

+4

@cyrux Se si crea un abstract di 'ABC_Base', quindi nessuno può creare oggetti di' ABC_Base'. – user470379

1

È necessario specificare i parametri del modello nella classe CDE o creare anche un modello CDE.

Prima opzione:

class CDE { 
private: 
    list< ABC<int>* > some_list; 
}; 

Seconda opzione:

template <class T> 
class CDE { 
private: 
    list< ABC<T>* > some_list; 
}; 
1

L'elenco può memorizzare solo un singolo tipo. Le diverse istanze di un modello sono tipi diversi. Se questo è soddisfacente, si può fare in questo modo:

template <class T> class CDE{ private: list<ABC<T> *> some_list; }

Se è necessario utilizzare tipi diversi, forse si potrebbe creare una classe di base non-modello per l'ABC e memorizzare puntatori a quello. (ad esempio, utilizzare un'interfaccia)