相关疑难解决方法(0)

如何在没有Singleton的情况下实现方便的日志记录?

我目前的实施,简化:

#include <string>
#include <memory>

class Log
{
  public:
    ~Log() {
      // closing file-descriptors, etc...
    }
    static void LogMsg( const std::string& msg )
    {
      static std::unique_ptr<Log> g_singleton;
      if ( !g_singleton.get() )
        g_singleton.reset( new Log );
      g_singleton->logMsg( msg );
    }
  private:
    Log() { }
    void logMsg( const std::string& msg ) {
      // do work
    }
};
Run Code Online (Sandbox Code Playgroud)

总的来说,我对此实现感到满意,因为:

  • 懒惰的实例化意味着我不付钱,除非我使用它
  • 使用unique_ptr意味着自动清理,因此valgrind很高兴
  • 相对简单,易于理解的实施

但是,负面因素是:

  • 单身人士不利于单元测试
  • 在我的脑海中引入一种伪全局(一点代码气味)的不和谐

所以这里是我的问题针对那些成功从他们的C++代码中驱逐所有单例的开发人员:

  • 您在应用程序范围的日志记录中使用什么类型的非Singleton实现?
  • 接口是否像上面的Log :: LogMsg()调用一样简单易用?

我想避免在我的代码中传递一个Log实例,如果可能的话 - 注意:我问,因为,如果有一个好的,合理的选择,我也想从我的代码中驱除所有Singletons.

c++ singleton c++11

39
推荐指数
3
解决办法
2万
查看次数

标签 统计

c++ ×1

c++11 ×1

singleton ×1