Also I would recommend splitting all the classes into separate files.  It's not an absolutely rule (e.g. if one class is used as a private helper for another it's common to put it in the same file) but in this case where these are separate publicly used types it's standard C++ practice.