2017-12-19 3 views
1

Ich habe eine Klasse, die wiefür die Klasse mit einer großen Anzahl von Elementen

class A{ 
    double a, b, c, d, e; 
    float af, bf, cf, df, ef; 
    std::vector<double> av, bv, cv, dv, ev; 
    std::vector<std::vector<double>> avv, bvv, cvv, dvv, evv; 

    A(){} 
    A(/*init values*/){/*Initialize all the values above using the input values*/} 
    ~A(){} 
} 

Nun würde Ich mag einen Zuweisungsoperator implementieren, so dass ich tun kann (in einer zweiten Klasse):

class B{ 
    private: 
     A ac, bc, dc; 
    public: 
     B(/*init values*/) 
     { 
      ac = A(/*init values*/); 
      bc = A(/*init values*/); 
      dc = A(/*init values*/); 
     } 
     ~B(){} 
} 

ich weiß, dass ich What is the copy-and-swap idiom? und What are the basic rules and idioms for operator overloading? folgen können und implementieren

A& A::operator=(A rhs) 
{ 
    swap(rhs); 
    return *this; 
} 

und die jeweilige swap -function:

friend void swap(A& first, A& second) 
{ 
    using std::swap; 

    swap(/*for each element*/); 
} 

tun so für alle Elemente ist anfällig für ein Element zu vergessen, was zu Fehlern in dem Code. Dasselbe gilt für Erweiterungen in der Zukunft, d. H. Hinzufügen von Variablen im Klassenheader, aber nicht in der Swap-Funktion. Gibt es dafür einen einfacheren Weg?

+2

Sie wissen, dass Sie den Zuweisungsoperator nicht selbst schreiben müssen, aber der Compiler generiert wird, wird nur gut sein? – user463035818

+1

Alle Ihre Elemente sind Typen mit der richtigen Wertesemantik. Sie müssen keine dieser Funktionen selbst implementieren. Der Compiler ist vollkommen in der Lage. – StoryTeller

+0

@ tobi303: Das bedeutet, dass ich einfach schreiben kann ac = A (/ ** /) '? –

Antwort

0

Sie könnten alle Datenmembers in einem Aggregat setzen und einfach keinen Konstruktor, Zuweisungsoperator und Destruktor deklarieren. Sie werden die Vorteile der Standard verschieben/Copykonstruktor/Zuordnung und Aggregat Initialisierung erhalten (die Ihnen helfen können, wenn die Initialisierung gerade nach vorne ist):

struct A{ 
    double a, b, c, d, e; 
    float af, bf, cf, df, ef; 
    std::vector<double> av, bv, cv, dv, ev; 
    std::vector<std::vector<double>> avv, bvv, cvv, dvv, evv; 
    }; 
void swap(A& a,A& b){ 
    a=std::exchange(b,a); 
    } 

Wenn Sie einige Invarianten zu halten haben, kann es hilfreich sein zu erklären, die Daten in einer inneren Struktur:

class A{ 
    struct data_t{ 
    double a, b, c, d, e; 
    float af, bf, cf, df, ef; 
    std::vector<double> av, bv, cv, dv, ev; 
    std::vector<std::vector<double>> avv, bvv, cvv, dvv, evv; 
    }; 
    data_t data; 
    //[...] 
    void swap(A& other){ 
    data = std::exchange(other.data,data); 
    } 
    }; 
+0

Wie unterscheidet sich diese Version von der in den obigen Kommentaren vorgeschlagenen Version (nur neugierig)? –

+0

@arc_lupus Es ist schlimmer als ich dachte. Sie sollten erwägen, ein wissenschaftliches Buch über C++ zu kaufen, Sie gehören zu der Kategorie von Personen, die den größten Nutzen aus dieser Vorlesung ziehen. – Oliv

+0

Sehen meine Fragen so schrecklich aus? o_O –

Verwandte Themen