C++单例(用static实现)

单例模式与日志记录
本文介绍了一个使用单例模式实现的日志记录类。该类包含静态成员函数用于获取实例,并提供了打开日志文件、写入日志及关闭日志文件的方法。同时展示了一个简单的单例类示例。
class Logger {  
public:  
  static Logger& Instance() 
  {  
    static Logger theLogger; 
    return theLogger;  
  }  
  bool openLogFile(string logFile);  
  void writeToLogFile(string sLine);  
  bool closeLogFile(string logFile);  

private:  
  Logger();                          // constructor is private  
  Logger(Logger const&);             // copy constructor is private  
  Logger& operator=(Logger const&);  // assignment operator is private  
  ~Logger();                         // destructor is private  
};  
// usage: Logger::Instance().openLogFile("logFile.txt");  

class Singleton  
{  
public:  
  ~Singleton(){}  
  static Singleton& Instance(){return instance_;}  
  // testing member  

protected:  
  Singleton(){}    
  Singleton(const Singleton&);  
  Singleton& operator=(const Singleton&);  

private:  
  static Singleton instance_;  
}; 
// Singleton::Instance().XXX();
### 方法 在C++中使用`static`实现单例模式主要有两种常见方法:利用静态成员变量和静态局部变量。 利用静态成员变量时,在类中定义一个静态指针成员变量来指向对象,同时使用互斥锁保证线程安全,在获取实的静态方法中进行判空和创建操作。 利用静态局部变量时,在获取实的静态方法中定义一个静态局部对象,C++11保证了静态局部变量初始化的线程安全性。 ### 原理 - **静态成员变量**:静态成员变量属于类而不是类的实,在程序的整个生命周期内只有一份拷贝。通过互斥锁可以保证在多线程环境下,只有一个线程能够创建对象,避免多次创建。 - **静态局部变量**:C++11规定,静态局部变量在多线程环境下初始化时,会保证只有一个线程进行初始化操作,其他线程会等待初始化完成,从而实现线程安全的延迟初始化。 ### 示 #### 静态成员变量示 ```cpp #include <iostream> #include <mutex> class Singleton { private: static Singleton* instance; static std::mutex mutex; protected: Singleton() { std::cout << "Singleton created.\n"; } public: // 禁止拷贝和赋值 Singleton(Singleton &other) = delete; void operator=(const Singleton &) = delete; static Singleton* getInstance() { std::lock_guard<std::mutex> lock(mutex); if (instance == nullptr) { instance = new Singleton(); } return instance; } }; Singleton* Singleton::instance{nullptr}; std::mutex Singleton::mutex; int main() { Singleton* s1 = Singleton::getInstance(); Singleton* s2 = Singleton::getInstance(); std::cout << s1 << std::endl; std::cout << s2 << std::endl; return 0; } ``` #### 静态局部变量示 ```cpp class Singleton { public: // 删除拷贝构造和赋值运算符 Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; // 全局访问点 static Singleton& getInstance() { static Singleton instance; // C++11保证线程安全的静态局部变量初始化 return instance; } private: Singleton() {} // 私有构造函数 ~Singleton() {} // 私有析构函数 }; // 使用示: Singleton& obj = Singleton::getInstance(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值