Data una classe base di gameObject
e una classe derivata di animatedGameObject
, ho pensato che potrebbe essere utile archiviare tutte le loro istanze in un std::vector
. Se il vettore GameObjects
è dichiarato come il tipo di base di gameObject*
, le istanze dell'oggetto derivate richiedono il cast.Esistono rischi di prestazioni per l'utilizzo di static_cast per gestire un vettore di oggetti misti (di base e derivati)? (alias "è un'idea stupida?")
Esempio:
vector<gameObject*> GameObjects;
gameObject A* = new gameObject(...init...);
animatedGameObject B* = new animatedGameObject(...init...);
GameObjects.push_back(A);
GameObjects.push_back(B);
// to access the animatedGameObject functions:
static_cast<animatedGameObject*>(GameObjects[1])->functionUniqueToAnimated();
Aver paura come al solito, mi rivolsi a Scott Meyers (Effective C++, 3rd Edition), che scrive sul tema:
Molti programmatori credono che calchi non fare nulla ma chiedi ai compilatori di trattare un tipo come un altro, ma questo è sbagliato. Digitare conversioni di qualsiasi tipo (sia esplicite tramite cast o implicite dai compilatori) spesso portano al codice che viene eseguito in fase di runtime.
ho letto attraverso il suo Articolo 27: Ridurre al minimo Casting due volte, ma data la mia inesperienza con questo, sto lottando con la mia incapacità di rispondere a una semplice domanda "questa è una cosa stupida da fare?"
devo dire che ci sono diversi motivi per cui è una cosa stupida da fare che non hanno nulla a che fare con invocando static_cast
. Le domande, in ordine di importanza, sono:
- Am non ho visto alcune possibili rischi con l'uso di
static_cast
nel mio esempio di cui sopra? - Esistono strutture dati migliori rispetto allo
std::vector
per tali approcci? (Solo se c'è uno che è ovvio, non sto chiedendo di fare la mia ricerca per me.)
Questa è la mia prima volta facendo una domanda qui, quindi mi scuso in anticipo, se necessario.
+1 per aver letto Effective C++ – Borgleader
La solita cosa da fare qui sarebbe definire 'draw()' come una funzione virtuale nella classe base. Potresti quindi semplicemente chiamarlo senza calchi e farebbe la cosa giusta. Ne sei a conoscenza, ma vuoi sapere esattamente gli effetti del cast? – jogojapan
'boost :: ptr_vector' – Mehrdad