//final表示不可被继承classLogger final
{public:enumclassLogLevel{
Error,
Info,
Debug
};// 所有方法只能通过instance返回的引用来访问static Logger&instance();// 显式删除所有复制构造,Logger(const Logger&)=delete;Logger(Logger&&)=delete;// 显式删除所有赋值运算符
Logger&operator=(const Logger&)=delete;
Logger&operator=(Logger&&)=delete;// Sets the log level.voidsetLogLevel(LogLevel level);// Logs a single message at the given log level.voidlog(std::string_view message, LogLevel logLevel);// Logs a vector of messages at the given log level.voidlog(const std::vector<std::string>& messages,
LogLevel logLevel);private:// 构造和析构函数使用private限制防止被外部调用Logger();~Logger();// Converts a log level to a human readable string.
std::string_view getLogLevelString(LogLevel level)const;staticconstchar*const kLogFileName;//static inline const char* const kLogFileName ="log.out";//可以定义为内联变量直接初始化
std::ofstream mOutputStream;
LogLevel mLogLevel = LogLevel::Error;};/*以下例举一些关键定义和使用的代码*//*静态成员变量初始化必须在外部*/constchar*const Logger::kLogFileName ="log.out";//注意返回的是引用
Logger&Logger::instance(){//使用静态变量可以保证全局只有一份static Logger instance;return instance;}/*单例模式的使用*/Logger::instance().setLogLevel(Logger::LogLevel::Debug);// Log some messages.Logger::instance().log("test message", Logger::LogLevel::Error);