有一个单Logger
课,我觉得每次调用print方法都很难写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");
}
答案 0 :(得分:4)
请注意,由于您显然是在“本地”定义宏,因此宏不会考虑范围。
为什么不直接定义函数而不是宏:
inline
auto logger() -> Logger& { return Logger::GetInstance(); }
然后你可以写
logger().Print( "Hello" );
答案 1 :(得分:3)
干杯和赫思的两种选择。 - 阿尔夫回答:
如果在范围内需要多次使用,可以给记录器一个名称:
Logger& logger = Logger::GetInstance();
// ...
logger.Print("Hello, world");
或者你也可以使记录方法保持静态:
static void Logger::Print(const T &t) {
Logger::GetInstance().Print(t);
}
然后静静地打电话给他们:
Logger::Print("Hello world!");
您可能会争辩说,对于客户端,如果实际存在实例则无关紧要 - 构造函数是私有的,因此他们无论如何也无法创建自己的实例。因此静态方法是否创建实例应该不是他们关注的问题。在这种情况下,使用名为GetInstance
的公共方法实际上暴露了不相关的实现细节。