C++ 重载+;=连锁经营

C++ 重载+;=连锁经营,c++,vector,overloading,C++,Vector,Overloading,假设我有: class Date { int year, month, day; } 我有+操作符重载: friend CDate operator +(const Date &leftDate, const Date &rightDate) {} 我用右边的日期来增加左边的日期。那部分似乎有用 现在我想重载+=,如果我所做的只是date+=另一个\u日期,这就很简单了 但是,如果我必须链接它,例如:date+=另一个日期+另一个日期\u2我必须创建一个向量,其中将存

假设我有:

class Date {
    int year, month, day;
}
我有
+
操作符重载:

friend CDate operator +(const Date &leftDate, const Date &rightDate) {}
我用右边的日期来增加左边的日期。那部分似乎有用

现在我想重载
+=
,如果我所做的只是
date+=另一个\u日期
,这就很简单了

但是,如果我必须链接它,例如:
date+=另一个日期+另一个日期\u2
我必须创建一个向量,其中将存储
另一个日期
另一个日期2
,然后按顺序对它们进行添加:

Date& Date::operator +=(const vector<Date> &dates) {
    for(auto date: dates) {
        this->year += date.year;
        this->month += date.month;
        this->day += date.day;
    }
    return *this;
}
日期和日期::运算符+=(常量向量和日期){
用于(自动日期:日期){
本->年+=日期.年;
本->月+=日期.月;
此->天+=日期.day;
}
归还*这个;
}
我现在正在努力解决的问题是如何重载它返回向量的
+
操作符

到目前为止,我的想法是:

  • 向量运算符+(const Date&Date)
    :在哪里创建向量?为了插入
    日期
    ,我必须创建一个
  • 向量运算符+(向量和日期,常量日期和日期)
    :类似的问题,我还没有创建向量
那么如何重载
+
运算符,使其返回向量呢?

当您使用

date += another_date + another_date_2;
它被解释为:

date += (another_date + another_date_2);
我想这正是你想要的

不需要对象的
向量

你也可以使用

date += (another_date + another_date_2 + another_date_3 + another_date_4 + ...);
同样,当您使用时,不需要对象的
向量。

date += another_date + another_date_2;
它被解释为:

date += (another_date + another_date_2);
我想这正是你想要的

不需要对象的
向量

你也可以使用

date += (another_date + another_date_2 + another_date_3 + another_date_4 + ...);

再一次,不需要对象的
向量。

实际上,您可以使用单片
+
/
+=
-运算符实现您想要的功能,如Sahu所示,运算符只取
日期
参数,只返回
日期
对象

如果-出于任何原因,可能不是出于您问题中所示的情况-您确实希望
+
-运算符仅收集参数并返回向量,您可以通过以下方式实现:

class Date {
public:
    int year, month, day;

    Date& operator +=(const vector<Date> &dates) {
        for(auto date: dates) {
            this->year += date.year;
            this->month += date.month;
            this->day += date.day;
        }
        return *this;
    }

};


vector<Date> operator +(const Date &leftDate, const Date &rightDate) {
    vector<Date> result;
    result.push_back(leftDate);
    result.push_back(rightDate);
    return result;
}

vector<Date> operator +(const vector<Date> &left, const Date &rightDate) {
    vector<Date> result = left;
    result.push_back(rightDate);
    return result;
}


int main(void)
{
    // vector<Date> rhs = Date { 2,2,2 } + Date { 3,3,3 } + Date { 4,4,4 };

    Date d = { 1,1,1 };
    d += Date { 2,2,2 } + Date { 3,3,3 } + Date { 4,4,4 };
    return 0;
}
上课日期{
公众:
整数年、月、日;
日期和运算符+=(常量向量和日期){
用于(自动日期:日期){
本->年+=日期.年;
本->月+=日期.月;
此->天+=日期.day;
}
归还*这个;
}
};
向量运算符+(常量日期和左日期、常量日期和右日期){
矢量结果;
结果。向后推_(leftDate);
结果。推回(rightDate);
返回结果;
}
向量运算符+(常量向量和左、常量日期和右日期){
向量结果=左;
结果。推回(rightDate);
返回结果;
}
内部主(空)
{
//向量rhs=日期{2,2,2}+日期{3,3,3}+日期{4,4};
日期d={1,1,1};
d+=日期{2,2,2}+日期{3,3,3}+日期{4,4,4};
返回0;
}

实际上,您可以使用单片
+
/
+=
-运算符实现您想要的功能,这些运算符只接受
日期
参数,只返回
日期
对象,如Sahu所示

如果-出于任何原因,可能不是出于您问题中所示的情况-您确实希望
+
-运算符仅收集参数并返回向量,您可以通过以下方式实现:

class Date {
public:
    int year, month, day;

    Date& operator +=(const vector<Date> &dates) {
        for(auto date: dates) {
            this->year += date.year;
            this->month += date.month;
            this->day += date.day;
        }
        return *this;
    }

};


vector<Date> operator +(const Date &leftDate, const Date &rightDate) {
    vector<Date> result;
    result.push_back(leftDate);
    result.push_back(rightDate);
    return result;
}

vector<Date> operator +(const vector<Date> &left, const Date &rightDate) {
    vector<Date> result = left;
    result.push_back(rightDate);
    return result;
}


int main(void)
{
    // vector<Date> rhs = Date { 2,2,2 } + Date { 3,3,3 } + Date { 4,4,4 };

    Date d = { 1,1,1 };
    d += Date { 2,2,2 } + Date { 3,3,3 } + Date { 4,4,4 };
    return 0;
}
上课日期{
公众:
整数年、月、日;
日期和运算符+=(常量向量和日期){
用于(自动日期:日期){
本->年+=日期.年;
本->月+=日期.月;
此->天+=日期.day;
}
归还*这个;
}
};
向量运算符+(常量日期和左日期、常量日期和右日期){
矢量结果;
结果。向后推_(leftDate);
结果。推回(rightDate);
返回结果;
}
向量运算符+(常量向量和左、常量日期和右日期){
向量结果=左;
结果。推回(rightDate);
返回结果;
}
内部主(空)
{
//向量rhs=日期{2,2,2}+日期{3,3,3}+日期{4,4};
日期d={1,1,1};
d+=日期{2,2,2}+日期{3,3,3}+日期{4,4,4};
返回0;
}

将2018年3月17日增加到2017年4月6日的结果是什么?换句话说,为了让算术有意义,您需要两种不同的类型:一种表示日期,如2018年3月17日;另一种表示持续时间,如两年。
date-date=(2018年1月1日);日期+=年(3)+月(3)
,其中
年(3)
将返回
(3,0,0)
日期对象。很抱歉,我不清楚。将2018年3月17日添加到2017年4月6日的结果是什么?换句话说,为了让算术有意义,您需要两种不同的类型:一种表示日期,如2018年3月17日;另一种表示持续时间,如两年。
date-date=(2018年1月1日);日期+=年(3)+月(3)
,其中
年(3)
将返回
(3,0,0)
日期对象。对不起,我不清楚。AFAIK
a+=b+c
(a+=b)+=c
,所以我需要一个向量,在那里存储
b
c
,然后按顺序对它们执行
+
。@LeNguyenDuyAnh,不。
a+=b+c
a+=(b+c)
。请查看上的cppreference.com页面。同样
a+=b+=c
a+=(b+=c)
AFAIK
a+=b+c
(a+=b)+=c
,因此我需要一个向量,其中存储
b
c
,然后按顺序对它们执行
。@LeNguyenDuyAnh,否。
a+=b+c
。查看上的cppreference.com页面。另外
a+=b+=c
is
a+=(b+=c)