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 ? |