Как добавить вариант с проверкой на високосный год в феврале?

Делаю задачку по классу Person и никак не могу понять как впихнуть туда вариант с проверкой на високосный год в феврале(типа 28-29 день). Помогите, пожалуйста. Код прикрепляю:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

struct Date {
    
    private:
    
        int day;
        int month;
        int year;
        
        /*bool isLeapYear(int y){
            return (y % 400 != 0 && y % 4 != 0 || y % 100 == 0); //(y % 400 == 0 || y % 4 == 0 && y % 100 != 0);
        }*/
    
        bool IsValid(int d, int m, int y) {
            if ( d <= 0 || d > 31) {
                throw invalid_argument("Day is invalid.");
            }
            else if (m > 12 || m < 1) {
                throw invalid_argument("Month is invalid.");
            }
            else if (y < 0) {
                throw invalid_argument("Year is invalid.");
            }
            if(m == 2){
                if(d > 29){
                    throw invalid_argument("Day is invalid.");
                }
            }
            else if(m == 2 && (y%400 == 0 && y % 4 == 0 || y % 100 != 0)){
                throw invalid_argument("Day is invalid.");
            }
            
            return 1;
        }
        
    public:
    
        Date() {}
    
        Date(int d, int m, int y) { //конструктор
            if (IsValid(d, m, y)) {
                day = d;
                month = m;
                year = y;
            }
        }
        
};


    vector<string> CutIntoWords(string s) { //Делит строку на слова через пробел.
    vector<string> result;
    string buffer = "";  
    for(int i=0; i < s.size(); i++){
      if(s[i] != ' '){      
            buffer += s[i];     
      }
      else{
            result.push_back(buffer);
            buffer = "";
      }
    }
    if (buffer != "") {
        result.push_back(buffer);
    }
    return result;
}


class Person {
    
    private:
        string fullName; // ФИО
        Date birthday; // Дата рождения
        int height; // рост
        int weight; // вес
        string gender; // пол
        
        bool IsValid(string name, Date b, int h, int w, string g) {
            if ( h <= 0 || h > 400) {
                throw invalid_argument("Height is invalid.");
            }
            else if (w > 500 || w < 0) {
                throw invalid_argument("Weight is invalid.");
            }
            
            return 1;
        }
    
    public:
    
        Person() { // конструктор по умолчанию
            fullName = "Dmitriy Andreevich";
            birthday = Date(07,07,2007);
            height = 158;
            weight = 89;
            gender = "male";
        }
        
        Person(string name, Date b, int h, int w, string g) { // конструктор
            if (IsValid(name, b, h, w, g)) {
                fullName = name;
                birthday = b;
                height = h;
                weight = w;
                gender = g;
            }
        }
        
        void ChangeWeight(double percentage) { // метод изменения веса
            weight += (percentage*weight/100);
        }
        
        bool HasTwoWords() const {
            vector<string> words = CutIntoWords(fullName);
            return words.size() == 2;
        }
        
        string getInfo() const {
            return "His name is " + fullName + ", his gender is " + gender + "\n" + "His weight is " + to_string(weight) + ".\n";
        }
        
        bool IsFat() const {
            return weight > 50;
        }
        
        bool HasPatronymic() const {vector<string> words = CutIntoWords(fullName);
            return words.size() == 3;
        }
    
};


ostream &operator << (ostream &stream, Person p) {
    return stream << p.getInfo();
}


int main()
{
    Date d;
    try
    { 
       d = Date(29, 02, 1960);
    }
    catch (exception& e)
    {
        cerr << e.what() <<endl;
        return 0;
    }
    
    Person c;
    try
    { 
       c = Person("Petr Alekseevich", d, 186, 54, "male");
    }
    catch (exception& e)
    {
        cerr << e.what() <<endl;
        return 0;
    }

    cout << c;
    
    cout << "Has Two words in name: " << c.HasTwoWords() <<endl;
    
    c.ChangeWeight(20);
    cout << c;
    
    cout << "Weight is more than 50: " << c.IsFat() <<endl;
    
    cout << "Has Patronymic: " << c.HasPatronymic() <<endl;

    return 0;
}




Ответы (1 шт):

Автор решения: Harry

Закомментированный комментарий :) у вас верен

bool is_leap(int year)
{
    return (year%400==0) || ((year%4==0)&&(year%100!=0));
}

Лишние скобки поставил преднамеренно, для большей ясности :)

Ну, или самую чуточку более быстрый из-за сокращенного вычисления вариант:

bool is_leap(int year)
{
    return (year%4==0)&&(year%400==0 || year%100!=0);
}
→ Ссылка