swap implementerungsfrage



  • hallo

    angenommen es existiert eine basisklasse b und eine abgeleitete klasse d (die von b öffentlich erbt). nun da in d eine menge daten sind, ich aber nicht auf das copy-and-swap-idiom verzichten möchte, implementiere ich meine eigene swap-funktionen. wie kann ich in einer swap-member-funktion die basisklassen swappen? gibt es dafür überhaupt eine schöne darstellung? oder muss man einen manuellen dreieckstausch mit slicing machen?

    mfg


  • Mod

    struct B {};
    struct D : B
    {
    	void swap(D& other)
    	{
    		std::swap( *static_cast<B*>(this), static_cast<B&>(other) );
    	}
    };
    

    Das geht syntaktisch sicher schöner, aber auf die Schnelle will mir nichts einfallen.
    (Übrigens: Wieso keine swap -Memberfunktion in der Basisklasse?)



  • std::swap<B>(*this, other);
    

    sollte gehen, denke ich.



  • Nachtrag: Aber vermutlich suchtest du eher

    struct B {
      virtual void swap(B &other) { ... }
    };
    
    struct D : B
    {
        void swap(D& other)
        {
            B::swap(other);
        }
    };
    

  • Mod

    @seldon: Das ist doch Unfug! Das swap in D hat doch gar nicht dieselbe Signatur, und C++ unterstützt keine kovarianten Funktionsparameter!

    Edit: Oder du machst das swap virtual , da in abgeleiteten Klassen das swap mit der Basisklasse redefiniert werden könnte. Fände ich aber merkwürdig.



  • Das Livkovsche Substitutionsprinzip sagt Nein.

    struct B {
      virtual void swap(B &other) { ... }
    };
    
    struct D : B
    {
    ///lalalala
    };
    
    struct E : B
    {
    ///lalalala
    };
    
    //...
    E e;
    D d;
    e.swap(d);//???
    


  • die basisklasse habe nicht ich geschrieben sondern der anbieter einer library und der hat leider nicht so viel wert darauf gelegt. und ich kann das natürlich auch nicht ändern. ich werde heute abend mal den ersten und den zweiten vorschlag ausprobieren und mich dann nochmals melden.


Anmelden zum Antworten