The problem occurs in here, I get access violations, is there a way to this while keeping Display const or is this code valid and my problem is somewhere else and not being caught in the debugger?
I tried to make the return types const - but that didn't help :(
//Getters need const twice for this to work?
const char* Player::GetName() const {return m_name;}
const int Player::GetGrade() const {return m_grade;}
const double Player::GetGPA() const {return m_gpa;}
more relevant code
class Player
{
public:
char* GetName() const;
int GetGrade() const;
double GetGPA() const;
Another problem is that you never adding players to your array. You are adding pointer to the local variable which gets destroyed several lines later. So all your "Get" functions are called on invalid objects.
Do not use manual memory management. For example your array, you always manually reallocate is better replaced by vector of Players, or if you need indirection (why?) by vector of unique_ptr<Player>.
You have way more problems. I just do not want to hunt them all as it would be faster to just rewrite class from scratch.
I think you're using array for the first time without initialising it. The proper place for this is in the constructor.
On the whole though your use of pointers is quite alarming, you seem to be deliberately avoiding safe language features and the standard library. Is there a constraint on you to write this way?