Я студент колледжа и перехожу с Java на C ++. Нас познакомили с операторами перегрузки, которые я получаю по большей части, но при выполнении своего задания я был озадачен. Главный просит:

 Weight w1( -5, 35 ), w2( 5, -35 ), w3( 2, 5 ), w4( 1 ), w5, w6;
 //later on in main
 cout << "(w5 = 0) is " << ( w5 = 0 ) << endl;

Мои весовые объекты содержат две целых, одна для фунтов, другая для унций. Когда моя программа доходит до этой строки, для w5 уже установлено значение (0,0), однако я чувствую, что возвращаю адрес, поскольку при печати w5 получаю очень длинное число. Вот код, который у меня есть в .h и .cpp для конкретной перегрузки =

//Weight.h
Weight& operator=(const int);

//Weight.cpp
Weight& Weight::operator=(const int number)
{
Weight changer(number); //constructs weight object with one int to (int, 0)
return changer;
}

На форумах я узнал, что я не могу создать перегрузку друга, которая позволила мне принять 2 аргумента для функции. Любая помощь приветствуется!

//code for my << overload
ostream& operator << (ostream& output, const Weight& w)
{
switch(w.pounds)
{
    case 1:
    case -1:
        output << w.pounds << "lb";
        break;
    case 0:
        break;
    default:
        output << w.pounds << "lbs";
        break;
}
switch(w.ounces)
{
case 1:
case -1:
    output << w.ounces << "oz";
    break;  
case 0:
    break;
default:
    output << w.ounces << "ozs";
    break;
}

if (w.pounds == 0 && w.ounces == 0)
{
    output << w.ounces << "oz";
}

return output;
}
1
Elliott 10 Окт 2012 в 22:30
Можем ли мы увидеть вашу перегрузку для operator <<?
 – 
slugonamission
10 Окт 2012 в 22:33
Никаких проблем с компиляцией, но вот моя распечатка для w5 = 0
 – 
Elliott
10 Окт 2012 в 22:33
Извините, я неправильно прочитал вопрос. Похоже, ваша перегрузка << неверна
 – 
slugonamission
10 Окт 2012 в 22:34
... и вы фактически не сохраняете number в своем операторе присваивания, а просто создаете объект для возврата. Обычно нужно сохранить number и вернуть *this.
 – 
Joachim Isaksson
10 Окт 2012 в 22:36

1 ответ

Лучший ответ
//Weight.cpp
Weight& Weight::operator=(const int number)
{
   Weight changer(number); //constructs weight object with one int to (int, 0)
   return changer;
}

Это неправильно, вы возвращаете ссылку на временный объект. Этот объект выходит за рамки, и тогда у вас есть неправильные результаты.

Как правило, operator= - это присваивание, то есть вы хотите изменить состояние самого объекта. Поэтому в целом он должен выглядеть так:

//Weight.cpp
Weight& Weight::operator=(const int number)
{
   // whatever functionality it means to assign the number to this object
   return *this;
}
4
Chad 10 Окт 2012 в 22:34
Убийца. Я знал, что получил адрес обратно, но думаю, что бился головой о стену так долго, что потерял зрение. Это сработало отлично. Огромное спасибо!
 – 
Elliott
10 Окт 2012 в 22:41