Перевантаження оператора, додавши два помилки об'єкта

Я не знаю, чому цей код повинен працювати, але скажіть, що робити, якщо я хочу додати два об'єкти разом. будь ласка поки ви намагаєтеся відповісти, будь ласка, будьте більш конкретними

вибач за мій поганий англійський, я індійський, ось мій код.

#include

using namespace std;

class time
{
private:
    int sec;
    int mint;
    int hours;
public:
    int Inputsec;
    int Inputmint;
    int Inputhours;
time(int Inputsec, int Inputmint, int Inputhours):sec(Inputsec), mint(Inputmint), hours(Inputhours){};
time operator+(time Inputobj)
{
    time blah (sec+Inputsec,mint+Inputmint,hours+Inputhours);
    return blah;
}

void DisplayCurrentTime()
{
    cout << "The Current Time Is"<< hours<<" hours"<<"minutes"<<"seconds"<

код працює нормально, але це дає мені жахливий вихід. Де моя помилка?

1
Будучи індіанцем, це не виправдання для неповної теми - скопіюйте/вставте цей "жахливий випуск", і ми можемо насправді зрозуміти деякі з них.
додано Автор Niels Keurentjes, джерело
"жахливий вихід"? Як щодо розповісти нам фактичний і очікуваний результат?
додано Автор John Zwinck, джерело
"жахливий вихід"? Як щодо розповісти нам фактичний і очікуваний результат?
додано Автор John Zwinck, джерело
Також зверніть увагу: time вже існує в заголовку ctime .
додано Автор soon, джерело
"Я індійський", як це пов'язано з поганим ставленням до англійської?
додано Автор 0decimal0, джерело

6 Відповіді

Ваш оператор додавання використовує змінні для Inputsec , Inputmint та Inputhours , що входять до блоку ініціалізованих. Це має виглядати так:

time operatабо+(time Inputobj)
{
    return time(sec+InputObj.sec, mint+InputObj.mint, hours+InputObj.hours);
}

або

time operatабо+(time Inputobj)
{
    InputObj.sec += sec;
    InputObj.mint += mint;
    InputObj.hours += hours;
    return InputObj;
}

або, even better, implement time& operatабо+=(const time& rhs); and use it in a non-member addition operatабо:

time operatабо+(time lhs, const time& rhs)
{
  return lhs += rhs;
}

У вас є два набори змінних членів, що представляють однакову річ. Ви не потребуєте цього дублювання.

One final remark: there is something called std::time in header. Having a class called time, and using namespace std is asking fабо trouble. You should avoid both if possible (avoiding the second is definitely possible).

5
додано
Дякую, юань, що все вичерпує :)
додано Автор Noob.Alone.Programmer, джерело

Вам слід переписати ваш operator + принаймні таким чином:

time operator+(time Inputobj)
{
    time blah time(sec+InputObj.sec, mint+InputObj.mint, hours+InputObj.hours);
    return blah;
}

Крім того, я думаю, вам слід скористатися оператором % для отримання правильних результатів часу:

time operator+(time Inputobj){
    int s = (sec+InputObj.sec) % 60;
    int m = (sec+InputObj.sec)/60 + (mint+InputObj.mint) % 60;
    int h = (mint+InputObj.mint)/60 + (hours+InputObj.hours) % 24;
    return time(s,m,h);
}
1
додано

Вам слід переписати ваш operator + принаймні таким чином:

time operator+(time Inputobj)
{
    time blah time(sec+InputObj.sec, mint+InputObj.mint, hours+InputObj.hours);
    return blah;
}

Крім того, я думаю, вам слід скористатися оператором % для отримання правильних результатів часу:

time operator+(time Inputobj){
    int s = (sec+InputObj.sec) % 60;
    int m = (sec+InputObj.sec)/60 + (mint+InputObj.mint) % 60;
    int h = (mint+InputObj.mint)/60 + (hours+InputObj.hours) % 24;
    return time(s,m,h);
}
1
додано

Функція перевантаження вашого оператора використовує неініціалізовані змінні. Ініціалізація змінних inputsec, inputmint, Inputhours у вашому конструкторі.

Крім того, спробуйте це:

time operator+ (time Inputobj)
{
   time blah (sec+Inputobj.sec, mint+Inputobj.mint, hours+Inputobj.hours);
   return blah;
}
0
додано

Ваша помилка - це ваші члени громадськості з таким самим ім'ям, що і конструктор параметрів, які уніфіковано. Спробуйте це :

#include 
using namespace std;

class time
{
private:
    int sec;
    int mint;
    int hours;
public:
time(int Inputsec, int Inputmint, int Inputhours):sec(Inputsec), mint(Inputmint), hours(Inputhours)
{
};

time operator+(time Inputobj)
{
    time blah (sec+Inputobj.sec, mint+Inputobj.mint, hours+Inputobj.hours);
    return blah;
}

void DisplayCurrentTime()
{
    cout << "The Current Time Is"<< hours<<" hours"<<"minutes"<<"seconds"<
0
додано
Сеттери/Getters не повинні створюватися саме для неї, особливо для щось на зразок перевантаженого оператора +, оскільки клас має доступ до приватних членів його власного типу, коли вони використовуються як вхідні параметри, тому ви можете безпосередньо викликати Inputobj. сек у операторній функції +.
додано Автор Muckle_ewe, джерело

Ваша помилка - це ваші члени громадськості з таким самим ім'ям, що і конструктор параметрів, які уніфіковано. Спробуйте це :

#include 
using namespace std;

class time
{
private:
    int sec;
    int mint;
    int hours;
public:
time(int Inputsec, int Inputmint, int Inputhours):sec(Inputsec), mint(Inputmint), hours(Inputhours)
{
};

time operator+(time Inputobj)
{
    time blah (sec+Inputobj.sec, mint+Inputobj.mint, hours+Inputobj.hours);
    return blah;
}

void DisplayCurrentTime()
{
    cout << "The Current Time Is"<< hours<<" hours"<<"minutes"<<"seconds"<
0
додано
Сеттери/Getters не повинні створюватися саме для неї, особливо для щось на зразок перевантаженого оператора +, оскільки клас має доступ до приватних членів його власного типу, коли вони використовуються як вхідні параметри, тому ви можете безпосередньо викликати Inputobj. сек у операторній функції +.
додано Автор Muckle_ewe, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147