2016-11-29 2 views
1

Ich schrieb eine Klasse, die Qubit darstellen. Also Objekt hat nur einen Wert, Zustand, mit 0 oder 1 (bool). Um benötigte Berechnungen durchzuführen, habe ich Operatoren wie +, *,^überladen. Es scheint, dass alles mit + und * in Ordnung ist, auch mit ^, aber nur, wenn ich es nicht mit dem std :: ostream-Operator verwenden werde.XOR-Operator mit Std :: Ostream-Operator

Qubit x5, x6; 
cout << x5^x6; !ERROR! 

aber mit

Qubit x5, x6; 
Qubit z = x5^x6; 
cout << z; 

es arbeiten wird. Mein std: operator

std::ostream & operator <<(std::ostream & os, const Qubit & qubit) 
{ 
    os << qubit.GetState(); 
    return os; 
} 

und mein XOR-Operator

Qubit & Qubit::operator ^(const Qubit & qubit) 
{ 
    Qubit *q = new Qubit; 
    ((this->state == 1 && qubit.state == 0) || 
     (this->state == 0 && qubit.state == 1)) ? q->SetState(1) : q->SetState(0); 
    return *q; 
} 
+0

Kehren Sie zu Ihrem C++ - Buch zurück, und lesen Sie das Kapitel zur Vorrangstellung des Operators. –

+0

http://en.cppreference.com/w/cpp/language/operator_precedence –

+2

Sie haben ein Speicherleck in Ihrer 'operator ^' Funktion. Lesen Sie auch mehr über [Operatorüberladung] (http://en.cppreference.com/w/cpp/language/operators), insbesondere den kanonischen [binary arithmetic operators section] (http://en.cppreference.com/w/cpp/Sprache/Operatoren # Binary_arithmetic_operators). Beachten Sie das Beispiel, in dem Sie aufgefordert werden, * durch Wert * und nicht durch Verweis zurückzugeben. –

Antwort

7

cout << x5^x6 als (cout << x5)^x6 aufgrund Operatorpräzedenz ausgewertet.

Da Sie keinen überladenen XOR-Operator für ostream& und Qubit (oder const Qubit& usw.) bereitgestellt haben, schlägt die Kompilierung fehl.

Die Lösung ist cout << (x5^x6);

(Beachten Sie, dass die + und * Betreiber höher haben Vorrang als <<, weshalb sie arbeiten, wie Sie beschreiben) zu schreiben.

Schließlich haben Sie einen schwerwiegenden Speicherverlust im XOR-Operator (wer geht auf delete den zugewiesenen Speicher?). Fix, dass die Funktion, indem Sie einen Wert Kopie zurückzukehren:

Qubit Qubit::operator^(const Qubit& qubit) const

und verwenden Qubit q; im Funktionskörper. Benannte Rückgabewertoptimierung wird eine Wertkopie vermeiden. Weitere Informationen finden Sie unter http://en.cppreference.com/w/cpp/language/operator_arithmetic

+0

Vielen Dank für Ihre Hilfe! – Tatarinho