2016-11-29 65 views
1

我寫了一個代表Qubit的類。所以對象只有一個值,狀態,0或1(布爾)。爲了進行必要的計算,我重載了像+,*,^這樣的運算符。 似乎一切都可以用+和*,還有^,但只有當我不會將它與std :: ostream運算符一起使用。使用std :: ostream運算符的XOR運算符

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

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

它的工作。我的標準:運營商

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),特別是規範[二進制算術運算符部分](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