2016-11-29 73 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