如何缩短单身人士的电话?

时间:2011-05-09 14:05:11

标签: c++

我有一个基本上处理日志的单例类。我在代码中调用它的每个地方,我都要输入:

LogClass::GetInstance()->WriteToLog("text");

如何缩短此调用以便我可以只键入WriteToLog("text")并调用单例对象上的函数?

6 个答案:

答案 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");

因此,我可以轻松地立即关闭所有调试消息。