Solución:
La forma más fácil es escribir dos funciones, una que convierte el día en un número de días a partir de una fecha de inicio determinada, y luego otra que convierte de nuevo en una fecha. Una vez que la fecha se expresa como un número de días, es trivial agregarle o restarle.
Puede encontrar los algoritmos aquí: http://alcor.concordia.ca/~gpkatch/gdate-algorithm.html
Realmente no necesita un algoritmo como tal (al menos no algo digno de ese nombre), la biblioteca estándar puede hacer la mayor parte del trabajo pesado; Los cálculos del calendario son notoriamente complicados. Siempre que no necesite fechas anteriores a 1900, entonces:
#include <ctime>
// Adjust date by a number of days +/-
void DatePlusDays( struct tm* date, int days )
{
const time_t ONE_DAY = 24 * 60 * 60 ;
// Seconds since start of epoch
time_t date_seconds = mktime( date ) + (days * ONE_DAY) ;
// Update caller's date
// Use localtime because mktime converts to UTC so may change date
*date = *localtime( &date_seconds ) ; ;
}
Uso de ejemplo:
#include <iostream>
int main()
{
struct tm date = { 0, 0, 12 } ; // nominal time midday (arbitrary).
int year = 2010 ;
int month = 2 ; // February
int day = 26 ; // 26th
// Set up the date structure
date.tm_year = year - 1900 ;
date.tm_mon = month - 1 ; // note: zero indexed
date.tm_mday = day ; // note: not zero indexed
// Date, less 100 days
DatePlusDays( &date, -100 ) ;
// Show time/date using default formatting
std::cout << asctime( &date ) << std::endl ;
}
Supongo que esto es para algún tipo de ejercicio, de lo contrario, usaría una clase de tiempo que ya se le proporcionó.
Puede almacenar su tiempo como el número de milisegundos desde una fecha determinada. Y luego puede agregar el valor apropiado y convertirlo a la fecha al llamar a los descriptores de acceso de su clase.