static members vergleichen?



  • hi

    wie kann ich static members in vererbten Klassen vergleichen? Wenn ich das so mach stimmt das Ergebnis nicht:

    class Base
    {
         static int ID;
    };
    
    class DerivateA : public Base
    {
        static int ID;
    };
    
    class DerivateB : public Base
    {
        static int ID;
    };
    
    Base::ID = 0;
    DerivateA::ID = 1;
    DerivateB::ID = 2;
    
    bool checkType( const Base& a, const Base& b )
    {
        return a.ID == b.ID;
    }
    
    int main()
    {
        DerivateA A;
        Derivateb b;
        if(checkType( A, B );) cout << "Yes";
        return 0;
    }
    

    Frohe Weihnachten :xmas1:



  • Lass mich raten: Es wird "Yes" ausgegeben, obwohl es nicht sollte?

    Was du brauchst ist eine Funktion 'getID', die die ID der Instanz zurück gibt. Diese deklarierst du als virtuelle (eventuell sogar abstrakte) Funktion in der Basisklasse und überschreibst sie dann in den abgeleiteten Klassen. Anstatt nun direkt auf die ID-Variable zuzugreifen nutzt du in deiner 'checkType'-Funktion die Funktion 'getID'.



  • Hi,

    Meisters Antwort ist an sich schon recht gut, aber an dem Beispiel stoße ich ich ein wenig daran, dass Du scheinbar versuchst, explizit den Typ herauszufinden ... was man sehr viel seltender braucht, als man als Anfänger so meint - und dafür eine Menge Fallen bereithält.
    Meisters Weg deutet darauf hin, wie man (oft) programmieren kann. ohne sich auf diesen steinigen Weg zu begeben (Stichwort: "virtuelle Funktionen")...

    Gruß,

    Simon2.

    NACHTRAG: VERF***TE ERGO-TASTATUR MEINES VATERS !!!! (dauert ewig und dauernd Typos drin) 😡 😡 😡



  • @Simon2
    Ja, mag sein das man es selten braucht, ich brauchs aber unbedingt.
    Wie würdest du es denn machen?



  • Eigentlich geht nur die Methode mit virtuellen Funktionen. Wenn aber die Vererbungshierarchie nur "Beiwerk" ist, kannst du es auch mit Templates realisieren:

    template <typename T1, typename T2>
    bool checkType (const T1&, const T2&)
    {
        return T1::ID == T2::ID;
    }
    

    Da ich das nicht annehme, kannst du es auch mit RTTI probieren:

    bool checkType (const Base& a, const Base& b)
    {
        return typeid (a) == typeid (b);
    }
    

    Aber das hat ordentlich Overhead und weist auf einen Designfehler hin.



  • .filmor schrieb:

    Eigentlich geht nur die Methode mit virtuellen Funktionen. Wenn aber die Vererbungshierarchie nur "Beiwerk" ist, kannst du es auch mit Templates realisieren:

    Wie meinst du das "Beiwerk"?

    .filmor schrieb:

    Da ich das nicht annehme, kannst du es auch mit RTTI probieren:
    Aber das hat ordentlich Overhead und weißt auf einen Designfehler hin.

    Das hatte ich erst, und wegen dem Overhead wollt ichs wegmachen. Aber das Design ist nicht von mir, sondern von Marcus Bäckmann^^
    Die Umgebung soll nach bestimmten Tieren abgesucht werden.



  • nuuuub schrieb:

    .filmor schrieb:

    Eigentlich geht nur die Methode mit virtuellen Funktionen. Wenn aber die Vererbungshierarchie nur "Beiwerk" ist, kannst du es auch mit Templates realisieren:

    Wie meinst du das "Beiwerk"?

    Vergiss es, das hilft dir nicht weiter.

    nuuuub schrieb:

    .filmor schrieb:

    Da ich das nicht annehme, kannst du es auch mit RTTI probieren:
    Aber das hat ordentlich Overhead und weißt auf einen Designfehler hin.

    Das hatte ich erst, und wegen dem Overhead wollt ichs wegmachen. Aber das Design ist nicht von mir, sondern von Marcus Bäckmann^^
    Die Umgebung soll nach bestimmten Tieren abgesucht werden.

    Es hindert dich niemand daran, das Design zu verbessern. Zeig mehr Code.



  • // class Sheep: public Creature
    Creature* Sheep::life_cycle( Neighborhood& neighborhood )
    {
    	if( is_lifetime_exceeded() )
    	{
    		neighborhood.clear();
    		return new Ground();
    	}
    	Grass grass;
    	neighborhood.erase_ifnot( &grass );
    //...
    
    // class IsNotCreatureType (Funktor)
    Neighborhood::IsNotCreatureType::IsNotCreatureType( Creature* creature )
    :	m_creature( creature )
    {
    
    }
    
    bool Neighborhood::IsNotCreatureType::operator()( Neighbor neighbor )
    {
    	return *( neighbor.second ) != *m_creature;
    }
    
    // class Neighborhood
    void Neighborhood::erase_ifnot( Creature* creature )
    {
    	assert( creature != 0 );
    	IsNotCreatureType is_not( creature );
    	m_neighbors.erase( std::remove_if( m_neighbors.begin(),
    									   m_neighbors.end(),
    									   is_not ),
    					   m_neighbors.end() );
    }
    
    //class Creature
    bool operator==( const Creature& lhs, const Creature& rhs )
    {
    	return typeid( lhs ) == typeid( rhs );
    	//return lhs.get_id() == rhs.get_id();
           //Hier wollt ich gern optimieren
    }
    
    bool operator!=( const Creature& lhs, const Creature& rhs )
    {
    	return !( lhs == rhs );
    }
    

    Hoff das bringt dir was und das du mir helfen kannst.


Anmelden zum Antworten