this-Referenz an Basis-Objekt



  • Hallo,

    ist folgender Code als kritisch einzustufen oder kann man so etwas gefahrenlos
    machen?

    MyObject::MyObject() : MyBaseObject(*this){
    }
    

    Das Objekt ist ja noch nicht vollständig erzeugt.

    Gruß,
    Mark



  • Wozu soll das gut sein? Du hättest eine Referenz auf sich selbst. *this ist das aktuelle Objekt, egal ob Du es in seiner Eigenschaft als MyObjekt oder als BaseObjekt ansprichst.
    Vielleicht ist Namensgebung schon ein wenig irreführend, evtl. wäre

    MyClass und BaseClass

    besser.



  • Belli schrieb:

    Wozu soll das gut sein?

    Als Beispiel:
    Stell dir vor du hast ein Objekt mit

    void operator<<(char c);
    

    Jetzt kann du eine Basis-Klasse schreiben, die ihn auf mehrere Typen erweitert.
    Diese möchtest du jetzt in deinem Objekt verfügbar machen.
    Dann erbst du davon und übergibst eine Referenz auf this und es kann alle anderen
    Typen ebenfalls...



  • Ähhh ... die abgeleiteten Klassen erben auch so die überladenen Operatoren:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class base
    {
    	public:
    		void operator<< (char c){str.push_back(c);}
    		void operator<< (int i){_i = i;}
    
    		string str;
    		int _i;
    };
    
    class derived : public base
    {
    };
    
    int main()
    {
    	derived obj;
    
    	obj << 'a';
    	obj << 'Z';
    
    	obj << 13;
    
    	cout << obj.str << endl;
    	cout << obj._i;
    }
    


  • davon mal abgesehen wird doch der copy ctor aufgerufen oder?
    weil man ja quasi ein objekt einer klasse an die eigene klasse gibt, ob das nun ein derivat oder nicht ist, sollte doch egal sein...



  • Nicht an die eigene Klasse, an das eigene Objekt, also an sich selbst.
    Aber als welchen Typ soll man die entsprechende Variable in der Basisklasse überhaupt vereinbaren?
    Bleibt eigentlich nur der Typ der Basisklasse selbst, denn die weiß ja nicht, welche Klassen irgendwann mal von ihr ableiten - und dann sieht man noch deutlicher, dass man eine Referenz auf sich selbst hat. Die hat man mittels this aber sowieso immer, also das macht imo keinen Sinn.



  • Ich meinte das etwa so:

    class Stream{
        virtual void operator<<(char i)=0;
    };
    
    class DataStream{
    public:
        DataStream(Stream& s) : stream(s){
        }
    
        void operator<<(int i){
            for(int j=0; j<sizeof(int); ++j){
                 stream << static_cast<char*>(&i)[j];
            }
        } 
    
    private:
        Stream& stream;
    }; 
    
    class SpecificStreamA : public DataStream, public Stream{
    public:
        SpecificStreamA() : DataStream(*this){
        }
        virtual void operator<<(char i)=0{...}
    }; 
    
    class SpecificStreamB : public DataStream, public Stream{
    public:
        SpecificStreamB() : DataStream(*this){
        }
        virtual void operator<<(char i)=0{...}
    };
    


  • Ach ich bin dähmlich...

    Dann kann ich auch dir pure virtual Funktion direkt in DataStream packen



  • Mark81 schrieb:

    Ach ich bin dähmlich...

    Ach, wie die Dahme?


Anmelden zum Antworten