【牛客带你学编程C++方向】项目练习第5期(截止4.10)


C++项目练习:第5期
练习时间:3月27日-4月10日(2周)
活动规则:
  • 每一期一个项目,届时会开新帖发布
  • 学员直接将答案提交到该贴评论区即可
  • 两周后,公布导师参考答案
  • 导师评选出当期最佳代码(将设置为精彩回复

奖励:牛客大礼包一份(牛客定制水杯 牛客定制笔 牛客定制程序员徽章 滑稽抱枕)
参与方式:直接将你的代码回复到本帖评论区

----------------------------------------------------

本期题目:

学习单例模式,使用C++编写简单的单例

简介:

因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。它有很多种实现方式,各自的特性不相同,使用的情形也不相同。今天要实现的是常用的三种,分别是饿汉式、懒汉式和多线程式。

通过单例模式, 可以做到:

1、确保一个类只有一个实例被建立 
2、提供了一个对对象的全局访问指针 
3、在不影响单例类的客户端的情况下允许将来有多个实例

参与方式:直接将你的代码回复到本帖评论区

全部评论
//懒汉模式:lazy load  只有用了才加载  复杂场景下也可以使用 namespace LAZY {     class Lock     {     public:         Lock(mutex& mux) :_mux(mux){             //_mux.lock();         }         ~Lock(){             //_mux.unlock();         }         //防拷贝     protected:         Lock(const Lock& mx);         Lock& operator=(const Lock& mx);     private:         mutex& _mux;     };     class Singleton     {     public:         //判断是否为空,如果为空则创建,不为空就直接返回         static Singleton* GetInstance()         {             //加锁线程安全,如果中间返回了会造成死锁  所以自己写了一个             //mu.lock();             lock_guard<mutex> lock(mu);             // 双检查             if (_ints == NULL)             {                 Lock lock(mu);                 if (_ints == NULL)                 {                                Singleton* tmp = new Singleton;                     //内存栅栏  栅栏之后和之前的语句不能被打乱 防止编译器对程序进行优化                     MemoryBarrier();                     _ints = tmp;                 }             }             //mu.unlock();             return _ints;         }         //销毁单例模式         static void DelInstance()         {             lock_guard<mutex> lock(mu);             if (_ints)             {                 cout << "test if delete" << endl;                 delete _ints;                 _ints = NULL;             }         }         //防拷贝,只声明不实现         Singleton(const Singleton&);         Singleton& operator=(const Singleton&);         void Print()         {             cout << "Singleton:" << _a << endl;         }     private:         //将构造函数声明为私有         Singleton() :_a(0)         {}         int _a;         static mutex mu;         static Singleton* _ints;     };     Singleton* Singleton::_ints = NULL;     mutex Singleton::mu;     void test()     {         Singleton::GetInstance()->Print();         //如果在此之后还有人创建单例怎么办??所以最好不要手动释放         //Singleton::DelInstance();         atexit(Singleton::DelInstance);     } } //饿汉模式:程序运行就创建  简洁,适用性会受到限制   namespace HUNGRY {     class Singleton     {     public:         static Singleton& GetInstance()         {             static Singleton inst;//进来第一次创建  后面进来不再创建,直接返回             return inst;         }         void Print()         {             cout << "Singleton:" << _a << endl;         }     protected:         Singleton() :_a(0)         {}         Singleton(const Singleton&);         Singleton& operator=(const Singleton&);         int _a;     };     void test1()     {         Singleton::GetInstance().Print();     } } int main() {     //HUNGRY::test1();     LAZY::test();     system("pause");     return 0; }
点赞 回复 分享
发布于 2018-04-01 10:35

相关推荐

Java面试先知:我也是和你一样的情况,hr 说等开奖就行了
点赞 评论 收藏
分享
酷酷的喜马拉雅山:感觉这比一直在初筛不动的好多了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务