PDA

Visualizza la versione completa : [C++] Sapere di che classe è un ogetto


MegaAlchimista
18-12-2012, 18:18
Salve a tutti, scusate per il titolo ma non riuscivo a trovarne uno più esplicativo.
Supponiamo di avere una classe base, con un metodo virtuale:



#include "mathvector.h" //classe scritta da me che rappresenta un vettore matematico

class RigidBody
{
public:
RigidBody();
virtual ~RigidBody();

//setter
inline void setPosition(MathVector s){_p = s;}
inline void setVelocity(MathVector v){_v=v;}
inline void setMass(double m){_m = m;}

//getter
inline MathVector position() const {return _pos;}
inline MathVector velocity() const {return _v;}
double mass() const {return _m;}

//virtuals
virtual void Collision(RigidBody& other) =0;

protected:
double _m;
MathVector _pos;
MathVector _v;
};


Supponiamo poi che io da questa classe tramite ereditarietà ne crei n (per esempio: sfera, cubo, cilindro, ecc...)
Nella reimplementazione del metodo
Collision(RigidBody& other) vorrei fare un switch per comportarmi in maniera diversa a seconda del tipo di other.
per esempio se il mio ogetto è una sfera e gli passo un'altra sfera, dovrò comportarmi in maniera diversa rispetto al caso in cui other sia un cubo.

Per far questo avevo pensato di inserire una proprietà stringa in sola lettura che contenga il tipo


Class RigidBody
{
.......
protected:
std::string _type; // == rigidbody, sphere, cube, ecc...
};


Però mi sembra strano che non ci sia un modo per controllare cosa sia other senza dover per forza occupare altra memoria, magari sono io che non ricordo come si fa, e che non riesco a ritrovarlo nel mio manuale di C++.
vi è mai capitata una situazione simile?
Ciò che voglio fare è possibile?
Inserire quella proprietà è un buon metodo?
Potrei aggirare il problema modificando l'implementazione?

A voi esperti la parola

pistilloi
18-12-2012, 19:58
Oggetto, doppia "g". Comunque sia, io aggiungerei un membro privato che identifica univocamente il tipo della figura solida rappresentata dall'oggetto in questione. Naturalmente il costruttore setterà con il valore appropriato questo campo, dopodiché costruire un metodo che vada a leggere il flag e lo interpreti; è cosa alquanto banale.
Non ho programmato granché in c++, pero trovandomi nella tua situazione penso farei proprio cosi! :ciauz:

MItaly
18-12-2012, 20:48
Puoi usare l'operatore typeid e in generale la RTTI (http://en.wikibooks.org/wiki/C%2B%2B_Programming/RTTI), tuttavia tieni conto che in genere se riesci a risolvere semplicemente con metodi virtuali ottieni codice più pulito ed efficiente.

Loading