Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit Polymorphismus

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.04.2007, 01:27 Uhr
tsluga



Hallo zusammen,

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


C++:
#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


C++:
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 ).


C++:
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 ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.04.2007, 09:09 Uhr
ao

(Operator)



C++:
typedef vector<BASE_TYPES*> Tuple;


Der Rückgabetyp von Tuple.at() ist BASE_TYPES* und nicht BASE_TYPES. Der anschließende Vergleich prüft also einfach die Speicheradressen auf Gleichheit und ruft keinen überladenen operator== auf.

Vermutlich besser:

C++:
cout<<( *(t.at(0)) == *(t.at(1)) ? "true" : "false")<<endl;


Gruß,
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.04.2007, 13:38 Uhr
~sluga
Gast


Ja, er vergleicht tatsächlich falsch und es muss *t.at(0) lauten.

THX
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: