2016-11-29 5 views
1

J'ai écrit une classe qui représente Qubit. Donc l'objet n'a qu'une seule valeur, état, avec 0 ou 1 (bool). Pour effectuer les calculs nécessaires, j'ai surchargé les opérateurs comme +, *, ^. Il semble que tout va bien avec + et *, aussi avec ^, mais seulement si je ne l'utilise pas avec l'opérateur std :: ostream.Opérateur XOR avec l'opérateur std :: ostream

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

mais avec

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

il fonctionne. Mon std: opérateur

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

et mon opérateur XOR

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

Revenez dans votre livre C++ et passez en revue le chapitre sur la priorité des opérateurs. –

+0

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

+2

Vous avez une fuite de mémoire dans votre fonction 'operator ^'. En savoir plus sur [surcharge opérateur] (http://en.cppreference.com/w/cpp/language/operators) en particulier la section canonique [opérateurs binaires arithmétiques] (http://en.cppreference.com/w/cpp/language/operator # Binary_arithmetic_operators). Notez l'exemple qui vous indique de renvoyer * par valeur * et non par référence. –

Répondre

7

cout << x5^x6 est évaluée comme (cout << x5)^x6 en raison de priorité des opérateurs.

Puisque vous n'avez pas fourni un opérateur XOR surchargé pour un ostream& et un Qubit (ou const Qubit& etc.), ne compilation.

La solution est d'écrire cout << (x5^x6);

(Notez que les + et * opérateurs ont une priorité plus élevée que << qui est la raison pour laquelle ils travaillent comme vous le décrivez).

Enfin, vous avez une fuite de mémoire sérieuse dans l'opérateur XOR (qui va à delete la mémoire allouée?). Résoudre ce problème en modifiant la fonction pour retourner une copie de la valeur:

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

et en utilisant Qubit q; dans le corps de la fonction. L'optimisation de la valeur de retour nommée élimine une copie de valeur. Pour plus de détails, voir http://en.cppreference.com/w/cpp/language/operator_arithmetic

+0

Merci pour votre aide! – Tatarinho