2

So In my program I have two variables called today and birthday. Both of these variables are type DayOfYear. The DayOfYear class takes in both the date and month. So when I call both today.setday and today.setmonth and birthday.setday and birthday.setmonth it assigns the values to the private variables created by the class for each variables. My teacher wants me to be able to type in the main function cout<<today and have it print both day and month for this variable how would i set this up?

 #include <iostream>
using namespace std;

class DayOfYear
{
    public:
        DayOfYear( );
        void setDay( );
        void setMonth( );
        void setYear( );
        void output( );
        int getMonth( );
        int getDay( );

    private:
        int tempday;
        int month;
        int day;
        int year;
        int leapyear;
        int cont;
};

int main()
{
    DayOfYear today, birthday;

    cout <<"what year were you born" <<endl;
    birthday.setYear( );
    cout <<"what year is it now" <<endl;
    today.setYear( );

    cout << "Enter today's date:\n";
        today.setMonth( );
        today.setDay( );

    cout << "Enter your birthday:\n";
        birthday.setMonth();
        birthday.setDay( );

    cout << "Today's date is ";
    today.output( );
    cout << "Your birthday is ";
    birthday.output( );

    if (today.getMonth( ) == birthday.getMonth( ) && today.getDay( ) == birthday.getDay( )) 
    // remove .operators (make boolean friend function that takes care of everything
    //this is where i need the help

        cout << "Happy Birthday!\n";
    else
        cout << "Happy Unbirthday!\n";

    return 0;
}
DayOfYear::DayOfYear( )
{
    month = 1;
    day = 1;
    year = 1970;
    leapyear = 0;
    tempday = 0;
}

void DayOfYear::output( )
{
    cout << "month = " << month
         << ", day = " << day << endl;
}

void DayOfYear::setYear( )
{
    cin >> year;

    if (year%400 == 0 || year%4 == 0 && year%100 != 0)
    {
        leapyear = 1; //set leapyear to true if conditions are met
    }

}

void DayOfYear::setDay()
{

    do 
    {

        cout << "Enter the day of the month: ";
        cin >> tempday;

        if(tempday > 28 && month == 2 && leapyear == 0)
        {
            cout << "invlaid day" << endl;
            tempday = 0;
        }

        else if(tempday > 30 && month == 4 ||tempday > 30 &&  month == 6 || tempday > 30 && month == 9 || tempday > 30 && month == 11)
        {
            cout << "invlaid day" << endl;
            tempday = 0;
        }

        else if(tempday > 31 && month == 1 || tempday > 31 && month == 3 ||tempday > 31  && month == 5 || tempday > 31 && month == 7 ||
                tempday > 31 && month == 8 || tempday > 31 && month == 10 || tempday > 31 && month == 12)
        {
            cout << "invlaid day" << endl;
            tempday = 0;
        }

        else
        {
            day = tempday;
        }

    } while(tempday == 0);
}

void DayOfYear::setMonth( )
{
    double invalid;

    do 
    {
        cout << "Enter month as a number: ";
        cin >> month;
        if (month > 12 )
        {
            cout << "invalid month" << endl;
            invalid = 1;
        }
        else if (month <= 12 && month >= 1)
        {
            invalid = 0;
        }

    } while (invalid == 1);

}
int DayOfYear::getMonth( ) 
{
    return month;
}

int DayOfYear::getDay( ) 
{
    return day;
}
David G
  • 94,763
  • 41
  • 167
  • 253
Sam Munroe
  • 1,266
  • 2
  • 20
  • 41

2 Answers2

3

You need to overload operator<<:

std::ostream& operator<<(std::ostream& os, const DayOfYear& d)
{
    os << "month = " << d.month << ", day = " << d.day << std::endl;
    return os;
}

See also this question for more information on that.

Make this a friend of DayOfYear too:

friend std::ostream& operator<<(std::ostream&, const DayOfYear&);

This is needed to make sure that the operator can access private members for your DayOfYear class.

I also saw that, in the source code, you mentioned you needed to overload operator== as well. The principle is the same, and the question I linked to should also help on that.

Community
  • 1
  • 1
Aleph
  • 1,209
  • 10
  • 19
2
class DayOfYear
{
public:
    friend bool operator ==(const DayOfYear& lhs, const DayOfYear& rhs) const
    {
        return lhs.getMonth() == rhs.getMonth()
            && lhs.getDay()   == rhs.getDay();
    }

    ...
};

...

if (today == birthday)
{
    // ...
}
David G
  • 94,763
  • 41
  • 167
  • 253