我有一个基本上处理日志的单例类。我在代码中调用它的每个地方,我都要输入:
LogClass::GetInstance()->WriteToLog("text");
如何缩短此调用以便我可以只键入WriteToLog("text")
并调用单例对象上的函数?
答案 0 :(得分:9)
使用转发功能
inline void WriteToLog(...string...)
{ LogClass::GetInstance()->WriteToLog(.....string......); }
答案 1 :(得分:5)
向LogClass添加静态函数:
class LogClass {
static void Write( const std::string & s ) {
GetInstannce()->WriteToLog( s );
}
};
然后:
LogClass::Write( "foobar" );
答案 2 :(得分:5)
#define LOG(str) LogClass::GetInstance()->WriteToLog(str);
答案 3 :(得分:2)
您可以在函数中本地临时存储类别名的指针: (假设“GetInstance返回指向单例的指针)
void foo()
{
Singleton* logger = LogClass::GetInstance();
logger->WriteToLog(...string...);
logger->WriteToLog(...string...);
}
答案 4 :(得分:1)
就个人而言,我发现暴露“单身人士”是不好的做法。
我过去曾在static
州拥有static
个功能:
class Logger {
public:
static void Write(std::string const& s);
private:
static std::ifstream _file;
};
但是,我更喜欢现在使用Monoids。当然,他们只是伪装成单身人士,但事后离开单身人士会更容易。
class Logger {
public:
void Write(std::string const& s);
private:
static std::ifstream _file;
};
您仍然必须处理所有单身人士问题,但您可以更轻松地远离它。
答案 5 :(得分:1)
我喜欢使用引用和operator()重载。
在LogClass.h文件中
class LogClass
{
public:
static LogClass& GetInstance()
{
static LogClass singleton;
return singleton;
}
void operator()( std::string msg );
//...
};
extern LogClass& myDebug;
在LogClass.cpp文件中
LogClass& myDebug = LogClass::GetInstance();
void LogClass::operator()( std::string msg )
{
// my stuff to to with the msg...
}
//...
然后,我可以这样使用它(在任何文件中包含LogClass.h):
myDebug("text");
确实,你必须记住它是一个全局变量 ...... 但另一方面, GetInstance方法被调用一次。
接下来我想添加一个简单的开关来立即停用所有debugMsg ...
所以我添加以下内容:
#if DEBUG_MODE
#define MY_DEBUG( msg ) myDebug( msg )
#else
#define MY_DEBUG( msg ) // will replace the myDebug calls by nothing.
#endif
因此,我可以使用:
MY_DEBUG("text"); // instead of myDebug("text");
因此,我可以轻松地立即关闭所有调试消息。