2016-08-18 4 views
-1

BetrachtenVerschieben Zuordnung/Konstrukt in C++ für die Klasse mit Referenz

class A 
    { 
    array<double, 10> array; 
    double &a5; 

    public: 
     A():a5(array.at(5)) 
     {} 

    }; 

Es fühlt sich an wie unterwegs Zuordnung oder Konstruktor auf dieser Klasse bewegen würde das Mitglied a5 ungültig machen. Ist das korrekt? Gibt es eine Problemumgehung?

+1

Dies scheint sehr zerbrechlich Code unabhängig davon bewegen. – Borgleader

+0

Wie stellst du dir die Implementierung von move assignment vor? – kfsone

+0

Und warum willst du das "bewegen"? Es wird mindestens so teuer wie eine Kopie sein. 'array' ist nicht dynamisch und der Inhalt wäre billiger kopiert als verschoben. – kfsone

Antwort

2

Um jede Möglichkeit a5 ungültig werden, implementieren Ihre eigene Zug Konstruktor/Zuordnung zu vermeiden den Array Inhalt zu kopieren/verschieben, aber nicht a5 ändern, zB:

class A 
{ 
    std::array<double, 10> arr; 
    double &a5; 

    A() 
     : a5(arr[5]) 
    {} 

    A(const A& src) 
     : arr(src.arr), a5(arr[5]) 
    {} 

    A(A&& src) 
     : arr(std::move(src.arr)), a5(arr[5]) 
    {} 

    A& operator=(const A& rhs) 
    { 
     if (this != &rhs) 
      arr = src.arr; 
     return *this; 
    } 

    A& operator=(A&& rhs) 
    { 
     std:swap(arr, src.arr); 
     return *this; 
    } 
}; 
+0

Danke für die Antwort .. Ich habe eine Frage bezüglich der Umzug Aufgabe. Warum tauschen? Warum nicht einfach kopieren? Gibt es einen Leistungsvorteil? – user6386155

+0

In Ihrem Beispiel spielt es keine Rolle, da das Array 'double' Werte enthält. Im Allgemeinen ist es jedoch üblich, die Zielmitglieder in das temporäre Quellenobjekt zu vertauschen, so dass ihr Destruktor sie nach dem Verschieben freigibt. Stellen Sie sich vor, Ihr Array enthält Objekte statt Zahlen. –

+0

Vielen Dank..das hat wirklich geholfen. – user6386155