#include <iostream>
#include <vector>
#include <string>

class player_character {
    std::string name;
    int dex, max_hp, exp, lvl;
public:
    player_character()                                  =default;
    player_character(const player_character&)           =default;
    player_character& operator=(const player_character&)=default;
    
    player_character(std::string name_,
                     int dex_, int max_hp_,
                     int exp_, int lvl_)
    :   name   { std::move(name_) }
    ,   dex    { dex_             }
    ,   max_hp { max_hp_          }
    ,   exp    { exp_             }
    ,   lvl    { lvl_             }
    {   }



    const std::string get_name() const { return name; }

    friend std::ostream& operator<<(std::ostream& os, const player_character& pc) {
        return os << "Character:  " << pc.name   << '\n'
                  << "Dexterity:  " << pc.dex    << '\n'
                  << "Max Health: " << pc.max_hp << '\n'
                  << "Experience: " << pc.exp    << '\n'
                  << "level:      " << pc.lvl    << '\n';
    }
};

player_character menu_select_player() {
    //populate with other default characters
    const std::vector<player_character> default_ctypes {
        { "warrior", 8, 5, 3, 5 }
    };

    for(std::size_t i=0u; i!=default_ctypes.size(); ++i) {
        std::cout << i << ". " << default_ctypes[i].get_name() << '\n';
    }

    std::size_t input;
    do {
        std::cout << "Please select an character by number: "; //implict flush on stdio tie
        std::cin >> input;
    } while(std::cin.fail() || input >= default_ctypes.size());

    return default_ctypes[input];
}

int main() {
    auto player=menu_select_player();
    std::cout << player << '\n';
}