2016-11-29 22 views
1

Qubitを表すクラスを作成しました。そのため、オブジェクトには1つの値state(0または1(bool))しかありません。必要な計算を行うために、+、*、^のような演算子をオーバーロードしました。 すべてのものは+と*、また^でも使用できますが、std :: ostream演算子では使用しない場合に限ります。XOR演算子とstd :: ostream演算子

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

しかし

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

でそれが働いています。私はstd:オペレータ

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

と私の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

を参照してください。C++の本に戻って、演算子の優先順位に関する章を参照してください。 –

+0

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

+2

'operator ^'関数でメモリリークが発生しました。また、[演算子オーバーロード](http://en.cppreference.com/w/cpp/language/operators)、特に正規の[2進算術演算子]セクション(http://en.cppreference.com/w/cpp)を参照してください。 /言語/演算子#Binary_arithmetic_operators)。参考にするのではなく、値*で*を返すように指示する例に注目してください。 –

答えて

7

cout << x5^x6が原因演算子の優先順位(cout << x5)^x6として評価されます。

ostream&Qubit(またはconst Qubit&など)にオーバーロードされたXOR演算子を提供していないため、コンパイルは失敗します。

溶液(+*演算子は、あなたが説明するように、彼らが働く理由である<<よりも高い優先順位を持っていることに注意してください)cout << (x5^x6);

を書くことです。

最後に、XOR演算子に深刻なメモリリークがあります(割り当てられたメモリはdeleteになります)。

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

と関数本体でQubit q;を使用します。値のコピーを返すように機能を変更していることを修正。 名前付き戻り値の最適化は値のコピーを取り除きます。詳細は、http://en.cppreference.com/w/cpp/language/operator_arithmetic

+0

助けてくれてありがとう! – Tatarinho

関連する問題