从DLL创建和导出C ++ Singleton类

时间:2011-06-06 06:00:50

标签: c++ windows visual-c++ com

我有一个小查询,如何从DLL创建和导出Singleton类?可以在同一应用程序的多个模块中共享。我的目的是创建一个可以登录同一文件的集中式自定义日志记录系统。

任何示例或链接将不胜感激。

1 个答案:

答案 0 :(得分:3)

ajitomatix发布的链接是一个模板化的单例,非模板解决方案可能如下所示:

class LOGGING_API RtvcLogger
{
public:
  /// Use this method to retrieve the logging singleton
  static RtvcLogger& getInstance()
  {
    static RtvcLogger instance;
    return instance;
  }

  /// Destructor
  ~RtvcLogger(void);

  /// Sets the Log level for all loggers
  void setLevel(LOG_LEVEL eLevel);
  /// Sets the minimum logging level of the logger identified by sLogID provided it has been registered.
  void setLevel(const std::string& sLogID, LOG_LEVEL eLevel);

  /// Log function: logs to all registered public loggers
  void log(LOG_LEVEL eLevel, const std::string& sComponent, const std::string& sMessage);

protected:
  RtvcLogger(void);
  // Prohibit copying
  RtvcLogger(const RtvcLogger& rLogger);
  RtvcLogger operator=(const RtvcLogger& rLogger);
  ....
};

LOGGING_API定义为

// Windows
#if defined(WIN32)
// Link dynamic
  #if defined(RTVC_LOGGING_DYN)
    #if defined(LOGGING_EXPORTS)
      #define LOGGING_API __declspec(dllexport)
    #else
      #define LOGGING_API __declspec(dllimport) 
    #endif
  #endif
#endif

// For Linux compilation && Windows static linking
#if !defined(LOGGING_API)
  #define LOGGING_API
#endif

看起来你已经意识到了这一点,但为了完整起见,只要您的代码在Windows上的DLL中,Meyer的单例就可以工作,如果将其作为静态库链接,它将无法工作。 / p>