Перегрузка оператора QuantLib date ++ - PullRequest
0 голосов
/ 27 апреля 2020

По какой-то причине оператор перегрузки объекта QuantLib's Date ++ не работал должным образом, но я не понимаю, почему он не работал. Кто-то может указать причину?

Не было ошибок или предупреждений в следующем тестовом коде.

#include <ql/quantlib.hpp>
#include <ql/time/date.hpp>
#include <iostream>

int main()
{
        QuantLib::Date today = QuantLib::Date::todaysDate();

        std::cout << "today's date is " << today << std::endl;
        std::cout << "tomorrow is " << today++ << std::endl;
        std::cout << "tomorrow is " << today+1 << std::endl;

        return 0;
}

Возврат:

today's date is April 27th, 2020
tomorrow is April 27th, 2020
tomorrow is April 29th, 2020

Кажется, Оператор ++ увеличил день, но не отображает правильно, поэтому Date + 1 фактически снова увеличился до 29. Похоже, что разница между операторами ++ и + составляет (в date.hpp):

Date& operator++()
Date  operator++(int )
Date operator+(Date::serial_type days) const;
Date operator+(const Period&) const;

Essentially + + использует григорианский объект в Boost (в дате. cpp)

Date& Date::operator++() {
        dateTime_ +=boost::gregorian::days(1);
        return *this;
    }
Date Date::operator+(Date::serial_type days) const {
        Date retVal(*this);
        retVal+=days;

        return retVal;
    }

1 Ответ

0 голосов
/ 27 апреля 2020

Когда ++ идет после имени переменной, оно называется оператором приращения 'postfix'. Это возвращает копию переменной, а затем увеличивает саму переменную. Это не обязательно, как все перегрузки оператора приращения постфикса должны работать, но это общепринятая:

int i = 5;
int j = i++; //here j is 5
//i is now 6

Чтобы получить поведение, к которому вы стремитесь, вы должны использовать оператор приращения 'prefix', где ++ предшествует перед именем переменной. Это увеличивает переменную, а затем возвращает ссылку на нее:

int i = 5;
int j = ++i; //here j is 6, as is i

При перегрузке операторов перегрузка оператора postfix требует фиктивного аргумента, а перегрузка префиксного оператора - нет. Из вашего примера:

Date& operator++(); //prefix increment operator
Date  operator++(int) //postfix increment operator

Поэтому, чтобы увеличить переменную даты и вернуть ссылку на нее, используйте:

std::cout << "tomorrow is " << ++today << std::endl; //prefix operator
...