Problem mit Polymorphismus



  • Hallo zusammen,

    ich habe hier ein problem wo ich grad nicht weiter komme :

    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <string>
    
    using namespace std;
    
    class BASE_TYPES
    {
    	public:
    		BASE_TYPES() {}
    		BASE_TYPES(const BASE_TYPES &object)
    		{
    		}
    		BASE_TYPES &operator=(const BASE_TYPES &object)
    		{
    			return *this;
    		}
    		virtual bool operator==(const BASE_TYPES &object)
    		{
    			if(isOfType(object))
    				return hasSameValue(object);
    			return false;
    		}
    		virtual ~BASE_TYPES() {}
    	protected:
    		virtual bool hasSameValue(const BASE_TYPES &object) const = 0;
    		virtual bool isOfType(const BASE_TYPES &object) const
    		{
    			return ( typeid(*this) == typeid(object));
    		}
    };
    
    class L_int : public BASE_TYPES
    {
    	public:
    		L_int() {}
    		~L_int() {}
    		L_int(int value)
    		:_value(value)
    		{}
    		int getValue(void) const
    		{
    			return _value;
    		}
    		L_int &operator=(const L_int &object)
    		{
    			_value = object._value;
    			return *this;
    		}
    		L_int(const L_int &object)
    		{
    			_value = object._value;
    		}
    	private:
    		virtual bool hasSameValue(const BASE_TYPES &object) const
    		{
    			L_int v = static_cast<const L_int&>(object);
    			if(v.getValue( ) == getValue( ))
    				return true;
    			return false;
    		}
    		int _value;
    };
    
    typedef vector<BASE_TYPES*> Tuple;
    
    int main(void)
    {
    	Tuple t;
    	L_int a(13);
    	L_int b(13);
    	t.push_back(&a);
    	t.push_back(&b);
    	cout<<(a == b ? "true" : "false")<<endl;
    	cout<<( t.at(0) == t.at(1) ? "true" : "false")<<endl;
    	return 0;
    }
    

    Es geht darum, sich selbst "eigene Datentypen" zu definieren die von der Basis Klasse ableiten , die folgende Sachen zur Verfügung stellt :

    u.a.

    * Vergleichsoperator
    * Überprüfung, ob 2 "eigene Datentypen" vom gleichen Typ sind.

    Die Klasse L_int stellt dabei ein einfaches int dar. Mit isOfType(...) kann ich prüfen, ob es sich bei 2 Objekten um gleiche Typen handelt, wo es grad nicht will, ist der Vergleichsoperator ( === ). Ich will den in der Basis Klasse haben

    virtual bool operator==(const BASE_TYPES &object)
    {
          // Falls vom gleichen Typen
          if(isOfType(object))
            // Prüfe ob die Werte gleich sind
    	return hasSameValue(object);
          return false;
    }
    

    Die Methode hasSameValue(...) ist "pure virtual", da ich will, dass man den vergleich für seine eigene Datentypen selber machen einprogrammieren muss ( Ich weiß ja nicht, welche Datentypen sich jemand bastelt und wie er die vergleichen will ).

    cout<<(a == b ? "true" : "false")<<endl;
    cout<<( t.at(0) == t.at(1) ? "true" : "false")<<endl;
    

    Der erste Vergleich mit den Objekten funktioniert, beim zweiten nehme ich die in dem Vector gespeicherten Objekte ( bzw. Zeiger auf die Objekte ) und will nun ebenfalls mal vergleichen, was nicht geht, ich bekomme ein false. Er greift ( so denke ich ) nicht auf den Vergleichsoperator == in der Klasse L_int zu ?

    Wie könnte man das lösen 😕


  • Mod

    tsluga schrieb:

    cout<<(a == b ? "true" : "false")<<endl;
    cout<<( t.at(0) == t.at(1) ? "true" : "false")<<endl;
    

    Der erste Vergleich mit den Objekten funktioniert, beim zweiten nehme ich die in dem Vector gespeicherten Objekte ( bzw. Zeiger auf die Objekte ) und will nun ebenfalls mal vergleichen, was nicht geht, ich bekomme ein false. Er greift ( so denke ich ) nicht auf den Vergleichsoperator == in der Klasse L_int zu ?

    Wie könnte man das lösen 😕

    Indem du die Zeiger, die at liefert, dereferenzierst?



  • <spam>

    Vergleichsoperator ( === ).

    Wo ist hier der smilie mit drei augen? 😃
    </spam>


Anmelden zum Antworten