In un motore di gioco, hai Object
s composto da diversi componenti. Uno di questi è un RenderComponent
che può essere un Mesh
, un Sprite
o un Light
.
Ora, tutte queste classi sono molto diverse con interfacce non compatibili, quindi ricavarle tutte da RenderComponent
ha poco senso. Inoltre, un Object
può avere solo un RenderComponent
alla volta, quindi puoi salvare tre puntatori in Object
, due dei quali devono sempre essere nullptr
, sembra uno spreco. Quindi quello che mi è venuto in mente è usare RenderComponent
per memorizzare un puntatore void*
e il tipo.
class RenderComponent{
public:
enum class RenderType{
Mesh, Sprite, Light
};
RenderType getType(){ return type_; }
Mesh* asMesh(){
if(type_ == RenderType::Mesh)
return static_cast<Mesh*>(pointer_.get())
else
return nullptr;
} /* the same stuff for Sprite and Light */
RenderComponent(unique_ptr<Mesh>&& pointer) :
pointer_(std::move(pointer)),
type_(RenderType::Mesh)
{} /* the same stuff for Sprite and Light */
private:
unique_ptr<void> pointer_;
RenderType type_;
}
Dovrebbe funzionare come previsto, ma credo che questo sia un anti-modello. Sto praticamente scartando tutti gli aspetti tipografici del C ++ e poi li reimplemento da solo. Questo non può essere corretto.
Quindi, questo è un anti-pattern? Quali sono soluzioni alternative comuni per questo problema? Mi manca qualcosa di ovvio? O è una cosa conosciuta, ma (per una buona ragione) solo uno schema usato di rado?