【发布时间】:2014-03-07 01:05:04
【问题描述】:
有一个单例Logger 类,我觉得每次调用打印方法时都写Logger::GetInstance() 是丑陋的。我能想到的唯一解决方案是#define。有什么更好的吗,或者这个宏在这种情况下是否合理?
#include <iostream>
#include <fstream>
class Logger
{
public:
static Logger& GetInstance();
~Logger();
template <typename T>
void Print(const T &t);
void SetNewline(bool b);
void SetLogging(bool b);
private:
Logger();
Logger(const Logger&);
void operator=(const Logger&);
bool newline;
bool log;
std::ofstream file;
};
int main()
{
#define logger Logger::GetInstance()
logger.Print("Hello");
//Logger::GetInstance().Print("Hello");
}
【问题讨论】:
-
你为什么在
main方法里面#define这个记录器呢?#define不尊重范围。如果你只想要logger可用,你也可以使用Logger& logger = Logger::GetInstance()。 -
拥有每个需要记录的对象,在构造函数中调用GetInstance()并存储引用?
-
有点离题,但我更喜欢将
Logger作为参数传递给任何需要记录的函数。创建记录器的单点将是主要功能。我不喜欢全局可用的可修改状态。 -
@Onur 我会考虑的。这只是我虚构练习的游乐场,我还不是系统设计师...... :)
-
如果您将
Logger类设为接口(即抽象)并作为参考/(智能)指针传递,您可以轻松模拟记录器以进行单元测试等。您也不会遇到生命周期问题(想想另一个静态单例比记录器寿命更长但想要记录一些东西的情况......
标签: c++ preprocessor-directive