码迷,mamicode.com
首页 > 编程语言 > 详细

C++两种单例(饿汉式,懒汉式)

时间:2016-10-27 01:51:49      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:单例 c++

  1. 俄汉式



#include <iostream>
using namespace std;

class A{
public:
    static A& getInstance(void){
        return s_instance;
    }
private:
    A(int data=0):m_data(data){}
    A(A const& that);
    int m_data;
    static A s_instance;
};
A A::s_instance(1234);
int main(void){
    A& a1 = A::getInstance();
    A& a2 = A::getInstance();
    cout << &a1 << ‘,‘ << &a2 << endl;
    return 0;
}


这个是以静态成员作为单例的。

因为是单例,所以禁止创建其他A类对象,A a调用构造函数创建对象,所以将A类的构造函数放在

private里,A a = A::getInstance()调用拷贝构造函数创建对象,所以将拷贝构造函数放在private里

面,同时接口函数static A& getInstance(void),是静态的,如果是非静态的,那么怎么调用getInstance

函数呢,所以必须是静态的.

注意:静态成员对象s_instance是可以调用私有的构造函数的(我也不知道为什么).


2.懒汉式

#include <iostream>
using namespace std;


class A{
public:
    static A& getInstance(void){
        if(!s_instance){
            s_instance  = new A(1234);
        }
        return *s_instance;
    }
    void release(void){
        if(s_counter && --s_counter==0){
            delete this;
            s_instance = NULL;
        }
    }
private:
    ~A(void){}
    A(int data = 0):m_data(data){}
    A(A const& that);
    int m_data;
    static int s_counter;
    static A* s_instance;
};
int A::s_counter = 0;
A* A::s_instance = NULL;
int main(void){
    A& a1 = A::getInstance();
    A& a2 = A::getInstance();
    cout << &a1 << ‘,‘ << &a1 << endl;
    a1.release();
    a2.release();
    return 0;
}



这里是以静态成员指针作为单例,也没什么好说的了.

注意:静态成员指针s_instance,在new A(1234)时调用构造函数,但是在delete this时,是不会调用析够函数的,不管是公有的析构函数还是私有的析构函数(为什么不能调用析构函数我也不知道)


本文出自 “12208412” 博客,请务必保留此出处http://12218412.blog.51cto.com/12208412/1866052

C++两种单例(饿汉式,懒汉式)

标签:单例 c++

原文地址:http://12218412.blog.51cto.com/12208412/1866052

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!