为链操作重载+ =

时间:2018-04-08 20:18:47

标签: c++ vector overloading

我们说我有:

class Date {
    int year, month, day;
}

我的+运算符重载:

friend CDate operator +(const Date &leftDate, const Date &rightDate) {}

我在左边日期增加了正确的日期。那部分似乎有效。

现在我想重载+=,如果我所做的只是date += another_date,这是微不足道的。

但是,如果我必须将其链接起来,例如:date += another_date + another_date_2我必须创建一个向量,其中another_dateanother_date2将被存储,然后为每个向量添加顺序:

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;
}

我现在正在努力的部分是如何重载+运算符,它返回一个向量?

到目前为止我的想法:

  • vector<Date> operator +(const Date &date):我在哪里创建一个向量?我必须创建一个才能插入date
  • vector<Date> operator +(vector<Date> &dates, const Date &date):类似的问题,到目前为止我还没有创建过矢量。

那么如何重载+运算符,它会返回一个向量?

2 个答案:

答案 0 :(得分:5)

使用时

date += another_date + another_date_2;

它被解释为:

date += (another_date + another_date_2);

我认为这正是你想要的。

不需要vector个对象。

您也可以使用

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

再一次,不需要vector个对象。

答案 1 :(得分:0)

实际上,您可以通过单片+ / +=来实现您想要的效果 - 运算符仅采用Date个参数并仅返回Date个对象,如Sahu所示。

如果 - 由于任何原因可能不是你问题中显示的情况所驱动的 - 你真的希望+ - 运算符只收集参数并返回一个向量,你可以按如下方式实现:< / p>

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;
}