Frage zu abstrakten Klassen



  • Beschäftige mich noch nicht so lang mit C++ und habe folgendes Problem:
    von der abstrakten Basisklasse PObject

    #include <typeinfo>
    #include <iostream>
    using namespace std;
    
    class PObject
    {
      public:
        virtual ~PObject() {};
        bool sameClass(const PObject& a) const; // true, wenn a von der gleichen 
                                                // Klasse wie das aktuelle Objekt
                                                // ist, sonst false  
        const char* className() const;          // Rückgabe des Klassennamens
        virtual bool equals(const PObject& a) const = 0;
        virtual void output(ostream& out) const = 0;
        virtual void input(istream& in) = 0;
        virtual PObject& operator=(const PObject&) = 0;
    };
    
    inline bool PObject::sameClass(const PObject& a) const
    {
      	if (&typeid(this)==&typeid(a))
    		return true;                           
    	else 
    		return false;
    }
    
    inline const char* PObject::className() const
    {
      return typeid(this).name();     
    }
    
    inline bool operator==(const PObject& a, const PObject& b)
    {
    	return a.equals(b);
    }
    
    inline bool operator!=(const PObject& a, const PObject& b)
    {
      return !a.equals(b);
    }
    
    inline ostream& operator<<(ostream& out, const PObject& a)
    {
      a.output(out);
      return out;
    }
    
    inline istream& operator>>(istream& in, PObject& a)
    {
      a.input(in);
      return in;
    }
    

    wird die u.a. die Klasse PInteger abgeleitet

    #include "PObject.h"
    
    class PInteger : public PObject
    { 
      public:
    	PInteger (int=0);		//Konstruktor für einen Parameter mit Defaultwert 0
    	PObject& operator=(const PObject&);
        PInteger& operator=(const PInteger&);
    	bool equals(const PObject & a) const;
    	void input(istream& in);
    	void output(ostream& out) const;
      private:
    	int wert;
    };
    

    Wie implementiere ich die equals Methode?

    bool PInteger::equals(const PObject & a) const
    {
    	//??
    }
    

    Rückgabewert true wenn Werte gleich sind sonst false.
    Mein Problem, wie komme ich an den Wert des PObject Objektes? Die Basisklasse hat ja keine Datenkomponenten. Habe schon dynamic_cast probiert. Das scheitert aber, weil const class PObject nicht in class PInteger konvertiert werden kann.
    Bin für jede Idee dankbar.



  • Du könntest theoretisch

    void Integer::equals(Object const &p) {
      Integer const &i=dynamic_cast<Integer const &>(p);
      //...
    }
    

    machen.

    Aber ich finde den Ansatz nicht ok, da

    (a) wäre das unnötig langsam
    (b) würde es ja nicht direkt verbieten, dass man so etwas macht

    class Integer : public Object { /*...*/ };
    class Character : public Object { /*...*/ };
    
    int main() {
      Integer i;
      Character c;
      i==c;
    }
    

    Was einem plötzlich um die Ohren fliegt, ohne das man erstmal weiss warum.



  • Danke, es funktioniert.
    zu (b): ist theoretisch möglich.
    Dafür gibt es aber die sameClass Methode. Nur wenn Objekte von der gleichen Klasse sind, darf verglichen werden.


Anmelden zum Antworten