4.4
一份userprofile内含以下数据:登入记录、实际姓名、登入次数、猜过次数、猜对次数、等级–包括触及中级高级专家,以及猜对百分比。请写出一个名为userprofile的class,提供以下操作:输入,输出,相等测试,不等测试。其constructor必须邓工处理默认的用户等级,默认的登入名称guest。对于同样名为guest的多个用户,必须保证每个guest有他自己独有的登录会话(login session)。
//UserProfile.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS //报错说老方法_itoa()可能会照成内存泄漏
#include <iostream>
#include <string>
#include <map>
#include <cstdlib> //用到_itoa()
class UserProfile
{
public:
enum uLevel { Beginner, Intermediate, Advanced, Guru };//枚举类
UserProfile(std::string login, uLevel = Beginner);
UserProfile();//提供重载
bool operator == (const UserProfile&);
bool operator != (const UserProfile &rhs);//定义两种运算符
//以下用来读取私有参数
std::string login() const { return _login; }
std::string user_name() const { return _user_name; }
int login_count() const { return _time_logged; }
int guess_count() const { return _guesses; }
int guess_correct() const { return _correct_guesses; }
double guess_average() const;
std::string level() const;
//以下用来写入私有数据
void reset_login(const std::string &val) { _login = val; }
void user_name(const std::string &val) { _user_name = val; }
void reset_level(const std::string&);
void reset_level(uLevel newlevel) { _user_level = newlevel; }
void reset_login_count(int val) { _time_logged = val; }
void reset_guess_count(int val) { _guesses = val; }
void reset_guess_correct(int val) { _correct_guesses = val; }
void bump_login_count(int cnt = 1) { _time_logged += cnt; }
void bump_guess_count(int cnt = 1) { _guesses += cnt; }
void bump_guess_correct(int cnt = 1) { _correct_guesses += cnt; }
private:
std::string _login;
std::string _user_name;
int _time_logged;
int _guesses;
int _correct_guesses;
uLevel _user_level;
static std::map<std::string, uLevel> _level_map;
static void init_level_map();
//static std::string guest_login();
};
//定义猜对百分比
inline double UserProfile::guess_average() const
{
return _guesses ? double(_correct_guesses) / double(_guesses) * 100 : 0.0;
}
//construct函数用来初始化object参数
inline UserProfile::UserProfile(std::string login, uLevel level) :_login(login), _user_level(level),
_time_logged(1), _guesses(0), _correct_guesses(0) {}
//提供重载construct函数
inline UserProfile::UserProfile() : _login("guest"), _user_level(Beginner),
_time_logged(1), _guesses(0), _correct_guesses(0)
{
static int id = 0;//静态id id++后,下一个object的id累加
char buffer[16];//16个字节的容器(一个char一个字节)
_itoa(id++, buffer, 10);//_itoa(要转换的int,转换后的字符串存入的地方,进制)
_login += buffer;
}
inline bool UserProfile::operator==(const UserProfile &rhs)
{
if (_login == rhs._login && _user_name == rhs._user_name)
return true;
return false;
}
inline bool UserProfile::operator!=(const UserProfile &rhs)
{
return !(*this == rhs);
}
inline std::string UserProfile::level() const
{
static std::string _level_table[] = { "Beginner","Intermediate","Advanced","Guru" };
return _level_table[_user_level];
}
//重写输出流
std::ostream& operator << (std::ostream &os, const UserProfile &rhs)
{//输出格式 stan1 beginner 12 100 10 10%
os << rhs.login() << " " << rhs.level() << " " << rhs.login_count() << " "
<< rhs.guess_count() << " " << rhs.guess_correct() << " " << rhs.guess_average() << std::endl;
return os;
}
std::map<std::string, UserProfile::uLevel> UserProfile::_level_map;//定义level_map(传入实参)
//初始化level_map
void UserProfile::init_level_map()
{
_level_map["Beginner"] = Beginner;
_level_map["Intermediate"] = Intermediate;
_level_map["Advanced"] = Advanced;
_level_map["Guru"] = Guru;
}
inline void UserProfile::reset_level(const std::string &level)
{
std::map<std::string, uLevel>::iterator it;
if (_level_map.empty())
init_level_map();
//在user中寻找,确保level是一个可识别的用户等级 it->second代表得到map的第二个位置的值
_user_level = ((it = _level_map.find(level)) != _level_map.end() ? it->second : Beginner);
}
std::istream &operator >> (std::istream &is, UserProfile &rhs)
{
std::string login, level;
is >> login >> level;
//以下是一系列初始化
int lcount, gcount, gcorrect;
is >> lcount >> gcount >> gcorrect;
rhs.reset_login(login);
rhs.reset_level(level);
rhs.reset_login_count(lcount);
rhs.reset_guess_count(gcount);
rhs.reset_guess_correct(gcorrect);
return is;
}
mian测试
#include "UserProfile.h"
#include <iostream>
int main()
{
UserProfile anon;
std::cout << anon;//测试输出符
UserProfile anon_too;
std::cout << anon_too;//测试是否得到唯一的标识符
UserProfile anna("AnnaL", UserProfile::Guru);
std::cout << anna;
anna.bump_guess_count(27);
anna.bump_guess_correct(25);
anna.bump_login_count();
std::cout << anna;
std::cin >> anon;//测试输入符
std::cout << anon;
}
补充一点,ASCII码,对应的字符是(Null),其实就是‘\0’,即空字符。判断一个字符串是否结束的标志就是看是否遇到‘\0’,如果遇到‘\0’,则表示字符串结束。
故buffer是一个可以存16位char的数组。