2009-08-17 4 views
2

См редактирования в концеПерегрузка операторов в C++

Я пытаюсь перегрузить оператор + в C++, чтобы позволить мне добавить два комплексных числа. (добавьте реальность и добавьте мнимую).

Вот моя перегруженная функция:

ComplexNum operator+(ComplexNum x, ComplexNum y){ 
ComplexNum result; 
result.real = (x.getReal() + y.getReal()); 
result.imag = (x.getImag() + y.getImag()); 

return result; 
} 

Мой комплекс номер конструктор принимает два Интс и назначен первым Int реален и второй в целое Imag.

Когда я пытаюсь добавить:

ComplexNum num1 = ComplexNum(1,1); 
    ComplexNum num2 = ComplexNum(2,3); 
    ComplexNum num3; 
    num3 = num1 + num2; 
    printf("%d",num3.getReal()); 

я получаю 0 в результате. Результат должен быть 3 (действительные части num1 и num2 добавлены)

EDIT: Я понял, что случилось. У меня были .getReal() и .getImage(), возвращающиеся дважды.

+2

Вы знаете шаблон 'std :: complex'? –

+0

Я хочу узнать, как это сделать –

+0

Вам нужно опубликовать код для всего вашего класса «ComplexNum». В частности, определение членов данных и вашего конструктора копирования и оператора присваивания копии (если определено пользователем). –

ответ

3

Поскольку аргументы оператора + объявлены как значения, а не ссылки, они будут переданы копией, поэтому, если копия-конструктор ComplexNum не работает, это может привести к тому, что x и y будут иметь действительную часть 0 .

Возможно также, что сложение работает, но вы теряете реальную часть при вызове оператора присваивания num3.

Возможно, это просто метод getReal(), который сломан.

1

Мне кажется, что либо ваш конструктор копирования, либо оператор присваивания сломан. Не могли бы вы также опубликовать код для них?

0

На боковой ноте: канонический способ реализации operator+ является свободными функциями на верхней части элемента operator+=. (. То же самое касается -=, *= и т.д., BTW) Для любого типа Т, он должен выглядеть следующим образом:

T operator+(const T& lhs, const T& rhs) 
{ 
    T tmp(lhs); 
    tmp += rhs; //invoke += 
    return tmp; 
} 

Обоснование этой конвенции (которые, IIRC, Страуструп приписывает Koenig):

  • + и +=- и -= и т. Д.) Делают почти то же самое; во избежание избыточности один должен быть выполнен поверх другого
  • += необходимо изменить левый операнд, чтобы он был членом; + оставляет свои аргументы в покое, поэтому должна быть свободная функция
  • обычно проще и/или более эффективно реализовать нечленов поверх членов; этот случай не является исключением

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

  • Нет связанных вопросов^_^