Funktioniert der Trick immer: operator= über Copy-Konstruktor und swap realisieren



  • Heya.
    Ich habe jetzt schon öfters gesehen das der operator= so implementiert wurde das ein temporäres Objekt über den Copy-Konstruktor erstellt wurde und dann per std::swap die Membervariablen mit denen von this getauscht worden sind.

    Funktioniert dieser (IMHO geniale :)) Trick eigentlich immer, wenn der Copy-Konstruktor richtig programmiert ist? 😮 😮



  • es lassen sich pathologische fälle konstruieren, wo es nicht klappt.
    in einem strategiespiel sei Armee eine basisklasse, die ein static member namens count hat, das die gesamtzahl der armeen festhält.
    im ctor wird ne armee um 1 erhöht und im dtor erniedrigt.
    ich bin in game gerade am limit mit 999 armeen und bei 1000 gibts ne hungersnot und nen bürgerkrieg und ich verliere das spiel.
    die version ohne swap bleibt bei 999. die mit swap hat kurzzeitig 1000 erreicht und ich bin tot.
    oder mein bs kann nur 10232 semaphoren öffnen und ich hab schon 10231 auf.
    ähm... die beispiel sind ja unfug, weil genau die klassen, wo mir so empfindliche klassen einfallen immer zugleich das NOCOPY-makro tragen.
    puh, da haben wir aber nochmal glück gehabt.



  • @Volkard: Ich mag deine Art so zu schriebenwie man denkt. Statt sich vrher alles zu überlegen und nur das Endprodukt hinzuschreiben kann man den Gedankenvorgang mitverfolgen und versteh so, wie du auf die Dinge kommst, was eigentlich viel wichtiger ist, als das Ergebnis.



  • Einen Fall gibt es noch:
    ein statisches Array als Member.

    Das Copy&Swap würde immernoch funktionieren - nur wäre ein Swap ja wieder ein Copy (denn man kann Arrays ja nicht swapen). Da wäre dann Copy&Swap uU nicht ideal.



  • hmm. kann man nicht? aber doch! muß man sogar machen. der witz am swap war, daß es exceptionbfrei ist. ist es auch, wenn die arraymembers exceptionfrei swappen.
    daher muß swap auch für jeden nicht-pod erts noch definiert werden. und dann kann man's doch gleich auch für arrays definieren.

    template<typename T,size_t SIZE>
    void swap(T a[SIZE],T b[SIZE])...//in der hoffnung, der compiler weiß, was ich meine
    

Anmelden zum Antworten