注册 登录
编程论坛 C++教室

关于<<重载问题

a99875984 发布于 2013-04-17 14:33, 517 次点击
程序代码:
#include <cmath>
#include <iostream>
using namespace std;

class Date
{
private:
    int year;
    int month;
    int day;
public:
    Date(int a=0,int b=0,int c=0);//
    ~Date(){}
    //int monthdays(int a,int b);
   
//Date operator +(const Date &t)const;
    Date operator +(const int a)const;
    int operator -(const Date &t)const;
    Date operator -(const int a)const;
    void operator<<(ostream & os);
};

Date::Date(int a,int b,int c)
{
    year=a;
    month=b;
    day=c;
}

int monthdays(int a,int b)
{
    if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)
        return 31;
    else if(b==2)
    {
        if(a%4==0&&a%100!=0||a%400==0)
            return 29;
        else
            return 28;
    }
    else return 30;
}

//似乎用不到日期加日期
/*
Date Date::operator+(const Date &t)const
{
    Date sum;
    Date count(t.year,t.month);
    for(int i=0;i<(year-t.year)*12+month-t.month;i++)
    {
        sum.day=(day+t.day)%monthdays(count.year,count.month);
        sum.month=(month+t.month+(day+t.day)/monthdays(count.year,count.month))%12;
        sum.year=(year+t.year+(month+t.month+(day+t.day)/monthdays(count.year,count.month)))/12;
        count.year++;
        count.month++;
    }
    return sum;
}
*/

Date Date::operator+(const int a)const
{
    Date sum;
    Date count(year,month);
    int b=a,i=0;
    while (b>monthdays(count.year,count.month))
    {
        i++;
        b-=monthdays(count.year,count.month);
        count.month;
        if(count.month>12)
        {
            count.month%=12;
            count.year++;
        }
    }
    sum.day=day+b;
    sum.month=month+i+sum.day/monthdays(count.year,count.month);
    sum.year=year+month/12;
    sum.month%=12;
    sum.day%=monthdays(count.year,count.month);
    return sum;
}

int Date::operator-(const Date &t)const
{
    Date count(t.year,t.month);
    int sum=0;
    while (year!=count.year||month!=count.month)
    {
        sum+=monthdays(count.year,count.month);
        count.month++;
        if(count.month>12)
        {
            count.month%=12;
            count.year++;
        }
    }
    sum+=day-t.day;
    return sum;
}

Date Date::operator-(const int a)const
{
    Date count(year,month);
    Date sum;
    int b=a;
    while(b>monthdays(count.year,count.month))
    {

    }
    return sum;
}

void Date::operator<<(ostream & os)
{
    os<<year<<'-'<<month<<'-'<<day<<endl;
}

//#include <iostream>
//using namespace std;
//#include "Date.h"
int main()
{
    Date t1(2012,1,1);
    int a=366;
    cout<<t1+a<<endl;
    system("pause");
    return 0;
}
如果想要想在主函数里这样输出成员对象,该怎么重载<<啊?谢谢了。
4 回复
#2
thlgood2013-04-17 15:44
将<<重载为友元函数!
#3
thlgood2013-04-17 15:50
程序代码:

friend ostream operator<<(ostream & os, Date & date);
...
ostream operator << (ostream & os, Date & date)
{
    return os << date.year <<'-'<< date.month <<'-'<< date.day << endl;
}
#4
a998759842013-04-17 15:51
回复 2楼 thlgood
谢谢了哈
#5
thlgood2013-04-17 15:54
如果你实在想让 << 重载为成员函数,那么你可以这样:
程序代码:

ostream operator<<(ostream & os);
{
    return os << "something";
}

//在调用的时候要把ostream放到 << 的右边;
Date *ptr = new Date(...);
ptr << cout;

要注意一点的是ostream不能用const修饰。因为 << 操作符会改动ostream

我是C++新手,关于以上的答案,我没有验证过。
1