#include <iostream>
#include <string>
class Player
{
private:
std::string name;
std::string password;
int hScore = 0;
int totalGames = 0;
int totalScore = 0;
int avgScore = 0;
//...
public:
//...
class Info
{
const Player &m_player;
void print(std::ostream &os) const {
os << "name: " << m_player.name << "\n"
<< "password: " << m_player.password << "\n"
<< "score: " << m_player.hScore << "\n";
}
public:
Info(const Player &player) : m_player(player) {}
friend std::ostream& operator<<(std::ostream &os, const Info &info)
{
info.print(os);
return os;
}
};
friend class Info;
struct Stats
{
const Player &m_player;
void print(std::ostream &os) const
{
os << "total games: " << m_player.totalGames << "\n"
<< "total score: " << m_player.totalScore << "\n"
<< "avg score: " << m_player.avgScore << "\n";
}
public:
Stats(const Player &player) : m_player(player) {}
friend std::ostream& operator<<(std::ostream &os, const Stats &stats)
{
stats.print(os);
return os;
}
};
friend class Stats;
};
int main()
{
Player p;
std::cout << "Player Info:" << std::endl;
std::cout << Player::Info(p);
std::cout << std::endl;
std::cout << "Player Stats:" << std::endl;
std::cout << Player::Stats(p);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgUGxheWVyCnsKcHJpdmF0ZToKICAgIHN0ZDo6c3RyaW5nIG5hbWU7CiAgICBzdGQ6OnN0cmluZyBwYXNzd29yZDsKICAgIGludCBoU2NvcmUgPSAwOwogICAgaW50IHRvdGFsR2FtZXMgPSAwOwogICAgaW50IHRvdGFsU2NvcmUgPSAwOwogICAgaW50IGF2Z1Njb3JlID0gMDsKICAgIC8vLi4uCgpwdWJsaWM6CiAgICAvLy4uLgoKICAgIGNsYXNzIEluZm8KICAgIHsKICAgICAgICBjb25zdCBQbGF5ZXIgJm1fcGxheWVyOwoKICAgICAgICB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSAmb3MpIGNvbnN0IHsKICAgICAgICAgICAgb3MgPDwgIm5hbWU6ICIgPDwgbV9wbGF5ZXIubmFtZSA8PCAiXG4iCiAgICAgICAgICAgIAk8PCAicGFzc3dvcmQ6ICIgPDwgbV9wbGF5ZXIucGFzc3dvcmQgPDwgIlxuIgogICAgICAgICAgICAJPDwgInNjb3JlOiAiIDw8IG1fcGxheWVyLmhTY29yZSA8PCAiXG4iOwogICAgICAgIH0KCiAgICBwdWJsaWM6CiAgICAgICAgSW5mbyhjb25zdCBQbGF5ZXIgJnBsYXllcikgOiBtX3BsYXllcihwbGF5ZXIpIHt9CgogICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgSW5mbyAmaW5mbykKICAgICAgICB7CiAgICAgICAgICAgIGluZm8ucHJpbnQob3MpOwogICAgICAgICAgICByZXR1cm4gb3M7CiAgICAgICAgfQogICAgfTsKICAgIGZyaWVuZCBjbGFzcyBJbmZvOwoKICAgIHN0cnVjdCBTdGF0cwogICAgewogICAgICAgIGNvbnN0IFBsYXllciAmbV9wbGF5ZXI7CgogICAgICAgIHZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtICZvcykgY29uc3QKICAgICAgICB7CiAgICAgICAgICAgIG9zIDw8ICJ0b3RhbCBnYW1lczogIiA8PCBtX3BsYXllci50b3RhbEdhbWVzIDw8ICJcbiIKICAgICAgICAgICAgCTw8ICJ0b3RhbCBzY29yZTogIiA8PCBtX3BsYXllci50b3RhbFNjb3JlIDw8ICJcbiIKICAgICAgICAgICAgCTw8ICJhdmcgc2NvcmU6ICIgPDwgbV9wbGF5ZXIuYXZnU2NvcmUgPDwgIlxuIjsKICAgICAgICB9CgogICAgcHVibGljOgogICAgICAgIFN0YXRzKGNvbnN0IFBsYXllciAmcGxheWVyKSA6IG1fcGxheWVyKHBsYXllcikge30KCiAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBTdGF0cyAmc3RhdHMpCiAgICAgICAgewogICAgICAgICAgICBzdGF0cy5wcmludChvcyk7CiAgICAgICAgICAgIHJldHVybiBvczsKICAgICAgICB9CiAgICB9OwogICAgZnJpZW5kIGNsYXNzIFN0YXRzOwp9OwoKaW50IG1haW4oKQp7CglQbGF5ZXIgcDsKCglzdGQ6OmNvdXQgPDwgIlBsYXllciBJbmZvOiIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IFBsYXllcjo6SW5mbyhwKTsKCglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKCXN0ZDo6Y291dCA8PCAiUGxheWVyIFN0YXRzOiIgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IFBsYXllcjo6U3RhdHMocCk7CgoJcmV0dXJuIDA7Cn0=