XOR 运算符与 std::ostream 运算符
XOR operator with std::ostream operator
我写了一个代表量子比特的class。所以对象只有一个值,state,有 0 或 1 (bool)。为了进行所需的计算,我重载了 +、*、^ 等运算符。
+ 和 * 似乎一切正常,^ 也是如此,但前提是我不会将它与 std::ostream 运算符一起使用。
Qubit x5, x6;
cout << x5^x6; !ERROR!
但是
Qubit x5, x6;
Qubit z = x5^x6;
cout << z;
它正在工作。我的 std:operator
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;
}
由于 运算符优先级 .,cout << x5 ^ x6
被评估为 (cout << x5) ^ x6
由于您没有为 ostream&
和 Qubit
(或 const Qubit&
等)提供重载的 XOR 运算符,编译失败。
解决方法是写cout << (x5 ^ x6);
(请注意,+
和 *
运算符的优先级高于 <<
,这就是它们按您描述的方式工作的原因)。
最后,你在 XOR 运算符中有严重的内存泄漏(谁去 delete
分配的内存?)。通过将函数更改为 return 值副本来解决此问题:
Qubit Qubit::operator^(const Qubit& qubit) const
并在函数体中使用Qubit q;
。 命名Return价值优化将避免价值复制。有关详细信息,请参阅 http://en.cppreference.com/w/cpp/language/operator_arithmetic
我写了一个代表量子比特的class。所以对象只有一个值,state,有 0 或 1 (bool)。为了进行所需的计算,我重载了 +、*、^ 等运算符。 + 和 * 似乎一切正常,^ 也是如此,但前提是我不会将它与 std::ostream 运算符一起使用。
Qubit x5, x6;
cout << x5^x6; !ERROR!
但是
Qubit x5, x6;
Qubit z = x5^x6;
cout << z;
它正在工作。我的 std:operator
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;
}
cout << x5 ^ x6
被评估为 (cout << x5) ^ x6
由于您没有为 ostream&
和 Qubit
(或 const Qubit&
等)提供重载的 XOR 运算符,编译失败。
解决方法是写cout << (x5 ^ x6);
(请注意,+
和 *
运算符的优先级高于 <<
,这就是它们按您描述的方式工作的原因)。
最后,你在 XOR 运算符中有严重的内存泄漏(谁去 delete
分配的内存?)。通过将函数更改为 return 值副本来解决此问题:
Qubit Qubit::operator^(const Qubit& qubit) const
并在函数体中使用Qubit q;
。 命名Return价值优化将避免价值复制。有关详细信息,请参阅 http://en.cppreference.com/w/cpp/language/operator_arithmetic