Как перегрузить операторы до и после приращения для объекта, который состоит из дня и месяца, которые будут напечатаны как std :: string? - PullRequest
0 голосов
/ 01 декабря 2018

Мне трудно определить, как решить часть проблемы, которую я делаю для своего курса C ++.Эта часть требует использования перегрузки оператора для правильного увеличения дней и месяца.Может быть, я упускаю из виду очень простую математику, но почему-то я немного смущен тем, как.Вот код, который у меня есть для моих перегруженных операторов префикса и постфикса для DayOfYear объектов:

//Operators
DayOfYear operator++ () {return day++; }
DayOfYear operator++ (int) {return ++day;}
DayOfYear operator-- () {return day--;}
DayOfYear operator-- (int) {return --day;}

Очевидно, что это избыточно, потому что day является int, поэтому он делает только то, что я уже могсделайте с ++ и -- для начала.Ниже приведен код для класса DayOfYear:

class DayOfYear {
    std::string month[12] = {"January", "February", "March",
                            "April", "May", "June", "July", "August", 
                            "September", "October", "November", "December"};

    //Each month's number of days, respectively
    int numDaysMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int day;

    //Convert day # to a string value
    static std::string dayToStr; 

    public:
        //First constructor
        DayOfYear (int day) {this -> day = day;} 

        //Second Constructor
        DayOfYear (std::string mth, int dayOfMonth) {
            //Make sure the dayOfMonth is valid
            if (dayOfMonth > 31 || dayOfMonth < 1) {
                if (mth == "February" && dayOfMonth > 28) {
                    std::cout << "Invalid day. February is assumed to be 28 
                    days for our purposes." << std::endl;
                 } else if ((mth == "April" || mth == "June" || mth == 
                    "September" || mth == "November") && dayOfMonth > 30) {
                    std::cout << "Invalid day. " << mth << " has only 30 
                    days." << std::endl;
                 } else {
                    std::cout << "Invalid day. The day should be >0 and <=31 
                    for most months." << std::endl;
                 }
           } else {
               day = dayOfMonth;
           }

       }

       //Accessors
       std::string getMonth (int mID) {return month[mID];}
       std::string getDay () {return dayToStr;}

       //Mutators
       void setDay (int d) {
           day = d;
       }

       //Operators
       DayOfYear operator++ () {return day++; }
       DayOfYear operator++ (int) {return ++day;}
       DayOfYear operator-- () {return day--;}
       DayOfYear operator-- (int) {return --day;}

       void print () {
           //TO-DO
       }
};

В данный момент код не будет компилироваться, потому что фрагменты еще не все.Тем не менее, я думаю, что я могу читать код довольно хорошо, поэтому я знаю, что мои операторы не будут работать.Каким-то образом мне нужно выяснить, как сделать этот код, чтобы моя main функция (ниже) могла правильно скомпилироваться и работать:

int main () {
    DayOfYear d (2);
    d.print ();
    d = 365;
    d.print ();
    d = 32;
    d.print ();

    d++;
    d.print ();

    d = 365;
    ++d;
    d.print ();
    d = 1;
    --d;
    d.print ();

    d = 32;
    d--;
    d.print ();

    DayOfYear e ("December", 31);
    e.print ();        

    return 0;
}

В частности, согласно спецификациям prof для этой лаборатории, мне нужнов

  1. - префикс и постфикс - операторы должны изменить объект (ы) DayOfYear так, чтобы он представлял предыдущий день.Если день уже является первым днем ​​года, новое значение объекта будет представлять последний день года.

  2. ++ префиксные и постфиксные операторы приращения ++.Эти операторы должны изменить объект DayOfYear, чтобы он представлял следующий день.Если день уже является концом года, новое значение объекта будет представлять первый день года.

Итак, я думаю, что мое решение потребует некоторого использования %.Может быть, я мог бы перегрузить это?Я не уверен.% может быть перегружено согласно учебнику.

Я читал учебник, и я думаю, что знаю основы перегрузки операторов в C ++, но я думаю, что мне не хватает чего-то простого или тонкого.Я пытался найти что-то конкретное для этого, но все, что я нашел, это общая информация о перегрузке операторов структурами и классами.Я не уверен, что делать в данный момент.Я думаю, что мой print () метод тоже будет сложной задачей, но решение этой проблемы должно значительно облегчить эту последнюю часть задания.

Буду признателен за любые указания или помощь!Спасибо.

РЕДАКТИРОВАТЬ: профессор четко заявил в требованиях проблемы, что я должен предположить, что год составляет 365 дней.

Я беру первый курс C ++, предлагаемый в моем колледже, поэтому, если есть лучший способ сделать это с более продвинутыми концепциями, НЕ ПОСТАВЛЯЙТЕ ЕГО , потому что они не имеют значения, и я, вероятно,не будет знать, о чем вы говорите.

Явные цели для назначения: Напишите класс с именем DayOfYear, который принимает целое число, представляющее день года, и переводит его в строку, состоящую измесяц, за которым следует день месяца.Примеры: День 2 => 2 января, День 32 => 1 февраля, День 365 => 31 декабря. Предположим, 365 дней в году.Конструктор для класса должен принимать в качестве параметра целое число, представляющее день года.Класс должен иметь функцию-член print (), которая печатает день в формате месяца-месяца, как в приведенных выше примерах.Добавьте второй конструктор, который принимает два параметра: строку, представляющую месяц, и целое число (1-31) для дня месяца.Затем конструктор должен инициализировать целочисленный член класса для представления дня, указанного в параметрах month и day of month.Добавьте следующие перегруженные операторы: операторы префикса ++ и постфикса.Эти операторы должны изменить объект DayOfYear, чтобы он представлял следующий день.Если день уже является концом года, новое значение объекта будет представлять первый день года.--prefix и постфиксные операторы декремента.Эти операторы должны изменить объект DayOfYear, чтобы он представлял предыдущий день.Если этот день уже является первым днем ​​года, новое значение объекта будет представлять последний день года.

Моя цель - выяснить эти операторы и в основном метод print (). Я думаю Я хорошо справился с остальными вещами, но это дает мне загвоздку.

1 Ответ

0 голосов
/ 01 декабря 2018

У всех ваших перегрузок есть проблемы.Одна вещь, которую они не должны делать, это возвращать int, а int day - это целое число.


DayOfYear operator++ () {return day++; }

Здесь тип возвращаемого значения DayOfYear, но предполагается, что оно будет DayOfYear&.

DayOfYear&operator++() {
    ++day;
    return *this;
}

DayOfYear operator++ (int) {return ++day;}

Здесьтип возвращаемого значения правильный.Вам просто нужно вернуть объект со старым значением:

  DayOfYear operator++(int) {
    auto old_val = *this;
    ++*this;
    return old_val;
  }

Включенные предложения @Deduplicator:

  • обратите внимание на использование auto .Это упрощает метод и улучшает удобочитаемость
  • ++*this может быть предпочтительнее, чем вызов оператора вручную, поскольку он короче и проще для ввода

То же самое относится к -- операторам


Реализация функции печати действительно проста, но у вас есть несколько вариантов:

Этот выводит дату на стандартный вывод.Недостатком является то, что единственное место, где печатается вывод, - это стандартный вывод:

void print () {
    std::cout << getDay () << " / "  << getMonth() << std::endl;
}

Вы можете отправить объект std::ostream и использовать его вместо std::cout:

void print (std::ostream& os) {
    os << getDay() << " / "  << getMonth() << std::endl;
}

Преобразование int в std::string очень удобно с помощью std :: to_string .Он определен в заголовке <string>, поэтому обязательно включите его:

std::string getDay () {
    return std::to_string(day);
}

Редактировать: Как указывал @Deduplicator, вы можете заменить функцию print перегрузкой <<:

friend std::ostream& operator<<(std::ostream& os, DayOfYear x) {
    os << getDay () << " / "  << getMonth() << std::endl;
    return os;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...