2015-09-24 3 views
3

У меня есть объект «d» типа Date. Я пытаюсь использовать оператор перегрузки, чтобы принимать только один параметр от пользователя вместо трех, которые имеют объекты. Другими словами, я хочу, чтобы программа могла принимать входные данные от пользователя и иметь возможность изменять только элемент данных «month_», а затем передать этот элемент данных в «incMon()», чтобы месяц и год, в соответствии с тем, что многие месяцы пользователь хочет увеличить дату, используя только элемент данных «month_».оператор перегрузки >>, передавая один параметр объекту вместо 3

Как настроить оператор перегрузки и incMon(), чтобы разрешить этот процесс?

Это то, что у меня есть.

void Date::read(istream & is) 
    { 
     unsigned month; 

     is >> month; 

     month_ = month; 

    } 


    istream & operator>>(istream & is, Date & d) 
    { 
     d.read(is); 
     return is; 
    } 
+0

Ну, на самом деле, я не понимаю, зачем вам нужен параметр Date для IncrementMonth? –

+0

Это часть моего требования. Если бы мне не нужен этот параметр даты, все было бы намного проще. –

+0

Это поможет, если вы сможете уточнить, что должен делать 'incrementMonth', так как вы не используете этот параметр. Изменяет ли параметр или '* this' или оба? Каковы ожидаемые значения 'd1' и' d2' после того, как вы произнесете 'd1.incrementMonth (d2, 1)'? (Мое предположение заключается в том, что 'd2' оставлен без изменений, а' d1' содержит дату, полученную в результате увеличения 'd2', на один месяц, но это только предположение.) – molbdnilo

ответ

1

Я интерпретирую исходный вопрос как: «Как заставить данную основную функцию работать?»

Minimal навязчивого способ, будет

istream & operator>>(istream & is, Date & d) 
{ 
    int num = 0; 
    is >> num; 
    d.incrementMonth(d, num); 
    return is; 
} 

Хотя я хочу подчеркнуть, что это решение приводит к довольно неожиданной коде (чтение объекта против чтение Int, чтобы увеличить).

+0

Это сработало отлично. его смешно, потому что я пробовал этот же метод и передал параметры d и num, и он не позволил бы этого. Я думаю, что установка istream в качестве друга исправила эту проблему. –

+0

Нет, я не пользуюсь другом. Вам нужно только быть другом, если вы попытаетесь изменить _month напрямую. – m8mble

+0

Я понимаю сейчас. Так что может быть проблема? Ошибка метода не была объявлена, когда я попытался сделать это раньше. –

1

перегруженный оператор ввода >> должен быть объявлен как другу:

friend istream & operator>>(istream & is, Date & d); 

и определены вне класса блока, как показано ниже:

istream & operator>>(istream & is, Date & d) 
{ 
    is >> d.month_; // input the month only 
    d.day_ = d.year_ = 0; 
    return is; 
} 

Для присвоения значений за день и год, назначьте некоторые допустимые значения по умолчанию, чтобы сделать объект даты завершенным при вводе Теперь ваш объект даты будет принимать входные данные от одного значения по желанию. Хорошо?

+0

Я понимаю, что ваше высказывание, но то, что должно случиться, - это день, который должен оставаться таким же, как день конструктора по умолчанию, но год и месяц предполагают соответственно изменить его при передаче параметра месяца. Поэтому, если дата была 01-01-2000 (месяц-день-год), а пользователь увеличил ее на 13 месяцев, тогда выход должен быть (02-01-2001).Я не уверен, как передать эти параметры для incrementMonth(). Спасибо за такой быстрый ответ. –

+0

@ mg7 Параметр 'd' уже содержит эти параметры, но они называются« переменными-членами ». – molbdnilo

+0

@molbdnilo Я смущен относительно того, о чем вы говорите. Можете ли вы объяснить немного дальше? –

1

насчет

int increment; 
cout << "Enter month increment (0 to exit): " << endl; 
cin >> increment; 
if (increment == 0) { 
    // your special exit stuff 
} 
d.incrementMonth(increment); 

Таким образом, вы можете сделать:

  1. Выход на 0, как печатный комментарий предлагает
  2. Устранить первый параметр метода incrementMonth. (Вместо этого используйте переменную this.)
+0

Да, я попытался это сделать, но я должен использовать эту конкретную функцию с этими точными параметрами. Это часть моего требования. –