First, congratulations on getting it to work. Most falter earlier.
Now, let's see what you can improve:
Generally, you use multiple files to enable separate compilation, and in line with that you don't #include source-files, only header-files.
Please, please ensure your files are consistently lower-case, even if Windows doesn't care. It's not quite as bad for source-files as for header-files, as nobody should #include them.
using namespace std;is plain evil. That namespace is not designed for inclusion, thus there is no comprehensive, fixed and reliable list of its contents.
See "Why is “using namespace std;” considered bad practice?" for details.You don't use anything from
<iomanip>, so don't include it.usrsis pretty useless. Just use astd::array<User, 2>and be done with it. As a bonus, you no longer need astd::list.Try to initialize variables on definition. As a bonus, you can use
auto, thus avoiding error-prone repetition of useless trivia.There are far simpler and more efficient ways to parse a number than creating and destroying a
std::stringstream. For examplestd::stoi().Never assume input is valid. And evenEven if it hasshould have the right format, a surprise, it might still ask for an illegal operation.
A block is a full statement. Adding an additional semicolon is valid most of the time, because it is its own empty statement. You will get problems with
else-branches though.If you output single characters, prefer character literals to length-1 string-literals. It might be marginally more efficient.
It's acceptable to indent access-specifiers one level. But then all members should be indented two levels, not only those after the first access-specifier.
Use the ctor-init-list to initialise members, though prefer in-class-initialisers if you can. Inside a ctor-body is far too late for initialisation.
That should be enough to point you in the right direction.