Just some thoughts on getters / setters:
Obviously, one has to have a way to get all the info in (Both initially & changing it later), and ways of getting it out (Either making use of the values, or outputting them). We need to avoid having a getter / setter for each member variable, because if we provide public functions to do this, then we may as well make all the member variables public!!!
There are several different things that can be done.
A simple idea is to think about how things happen in the real world, and provide functions that reflect this. For example, if someone wants to change their address, then provide a function to change ALL the address variables, not a function for each variable. Remember that a member function has direct access to the member variables.
The same idea for outputting data - quite often one might want to print out all the variable values. So provide a function that does this, rather than a get function for each member variable.
The other thing is when one has to make use of a member variable value to calculate some other value. For example, a health insurance policy might depend on someone's age to calculate the premium. You should minimise the number of public functions for this purpose. A better way might be to make use of friend functions or classes.
Another idea is to provide an interface to classes with virtual and / or pure virtual functions - which is what
ne555 was talking about.
Hope all goes well.