Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C++] Sapere di che classe è un ogetto

    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:

    codice:
    #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
    codice:
    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
    codice:
    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

  2. #2
    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!
    Dante

  3. #3
    Puoi usare l'operatore typeid e in generale la RTTI, tuttavia tieni conto che in genere se riesci a risolvere semplicemente con metodi virtuali ottieni codice più pulito ed efficiente.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.