//
// Base Class for our inheritance examples.
// Will include several layers of derived classes by end
// Initial Derived: Student, Staff, Academic
//
#include
#include
#include
using std::string;
class Person {
public:
// our base demographics for all people
long long uid = 15131324134;
// return age by subtracting current year
int age(int year) { return year - dob.year; }
// get dob as a string (so dob.tostring())
string get_dob() {
return std::to_string(dob.month) + "/"
+ std::to_string(dob.day) + "/"
+ std::to_string(dob.year);
}
string get_full_name();
string get_firstname();
string get_lastname();
protected:
// struct for holding name
struct name {
string first;
char m_initial;
string last;
};
// struct for holding date
struct date {
int year = 1900;
int month = 1;
int day = 1;
};
date dob;
// split passed string into first middle and last and assign to struct
// return struct to be assigned in derived classes
name assign_name(string n) {
// to hold our return values and words
name to_return;
std::vector words;
string word = "";
// loop through letters and add any with spaces delimiters (and last after)
for (const auto letter : n) {
if (letter != ' ') {
word += letter;
} else {
words.push_back(word);
word = "";
}
}
words.push_back(word);
// assign first then last and middle if availalbe - if not null middle
to_return.first = words[0];
if (words.size() > 2) {
to_return.m_initial = words[1][0];
to_return.last = words[2];
} else {
to_return.m_initial = ' ';
to_return.last = words[1];
}
return to_return;
}
};
class Student: public Person {
private:
name student_name;
public:
Student() {}
Student(string n, long long id) {
student_name = assign_name(n);
uid = id;
}
// setter for dob
void set_dob(int day, int month, int year) {
dob.day = day;
dob.month = month;
dob.year = year;
}
string get_full_name() { return student_name.first + " " + student_name.m_initial + " " + student_name.last; }
string get_firstname() { return student_name.first; }
string get_lastname() { return student_name.last; }
};
// Student's created this in class
class Staff: Person {
private:
const std::array departments = {"admin", "admission", "ITS",
"maintenance", "security", "student services",
"library"};
name staff_name;
string department;
string verify_department(string chosen_d) {
// if department matches it returns the department else unknown
for (const auto d: departments) {
if (d == chosen_d) {
return d;
}
}
return "unknown";
}
public:
Staff() {}
Staff(string n, long long id) {
staff_name = assign_name(n);
uid = id;
}
// using a function as a full member (no variable assigned)
string employee_type() {
if (department == "ITS" || department == "security" || department == "maintenance") {
return "support";
} else if (department == "library" || department == "student services") {
return "student support";
} else if (department == "admin" || department == "admission"){
return "admin";
} else {
return "unknown";
}
}
// getter and setters for the private variables
// setter for dob using string
void set_dob(string date, string delimiter = "/") {
// Whereas this parses a string and splits it into its numbers
// "1/1/11" is smallest date so if smaller just exit
// note - using Europe style will mess this up - d/m/yy
if (date.length() > 6) {
int start = 0;
int end = date.find(delimiter);
int dates[] = {0,0,0};
// so again - one could just loop until demlimiter and use same algo as words
// but I wanted to show the find/offset version here:
for (int i = 0; i < 3; i++) {
// using stoi (from string library) to cast our string to int
dates[i] = stoi(date.substr(start, end - start));
start = end + delimiter.size();
end = date.find(delimiter, start);
}
dob.month = dates[0];
dob.day = dates[1];
dob.year = dates[2];
}
}
// getter and setter for department (unknown if not a matching department passed)
void set_department(string d) { department = verify_department(d); }
string get_department() { return department; }
// getters for name (setter in Person)
string get_full_name() { return staff_name.first + " " + staff_name.m_initial + " " + staff_name.last; }
string get_firstname() { return staff_name.first; }
string get_lastname() { return staff_name.last; }
};