2016-11-29 4 views
1

Я написал класс, который представляет Qubit. Таким образом, объект имеет только одно значение, состояние, с 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::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из-за приоритета операторов.

Поскольку вы не предоставили перегруженный оператор XOR для ostream& и Qubit (или const Qubit& и т. Д.), Компиляция не удалась.

Решение написать cout << (x5^x6);

(Обратите внимание, что + и * операторы имеют более высокий приоритет, чем <<, поэтому они работают, как вы описали).

И, наконец, у вас есть серьезная утечка памяти в операторе XOR (кто собирается delete выделенной памяти?). Fix, что, изменяя функцию, чтобы вернуть копию значения:

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

и использовать Qubit q; в теле функции. Оптимизация именованного возвращаемого значения устраняет значение копии. Для получения дополнительной информации см. http://en.cppreference.com/w/cpp/language/operator_arithmetic

+0

Спасибо за помощь! – Tatarinho

Смежные вопросы