#include <string>

// the header file says the class Person exists, the these member functions exist (somewhere).
class Person
{
private:
    std::string name; // member variable
    int age;
    std::string gender;
public:
    // member functions
    // constructors: 
    // 1. no return type
    // 2. same name as class name
    // 3. can have one or many constructors.
    Person();
    Person(std::string n, int a, std::string g);
    // the copy constructor
    Person(const Person& other);

    // getters
    int getAge() const { return age; }
    std::string getGender() const { return gender; }
    std::string getName() const; // const here means this member function does not change any of the member variables.
				 
    // setters
    void setAge(int a) { age = a; }
    void setName(std::string n); // function prototype, aka function signature.
    void setGender(std::string g) { gender = g; }
};

// non-member function
bool compareByAge(const Person& A, const Person& B);

// defines the meaning of A == B
bool operator==(const Person& A, const Person& B);

// defines the meaning of A<B
bool operator<(const Person& A, const Person& B);
