C++의 단일 모드(일반,2B,문예)

4549 단어 C++단일 모드
1.일반 싱글 턴

#include<iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton* getInstance();
    private:
        static Singleton* instance;
        Singleton()
        {
            cout<<"constructor
";
            // do something
        };
        ~Singleton()
        {
            cout<<"destructor
";
            //do something
        }
};
Singleton* Singleton::instance = NULL;
Singleton* Singleton::getInstance()
{
    if(instance == NULL)
        instance = new Singleton();
    return instance;
}
int main()
{
    cout<<"begin main
";
    Singleton* instance = Singleton::getInstance();
    cout<<"end main
";
}
그러나 이러한 구조 함 수 는 자동 으로 호출 되 지 않 습 니 다.사용자 와 같은 사용자 가 수 동 으로 delete instance 를 사용 해 야 합 니 다.이것 은 좋 지 않 습 니 다.
이것 은 게으름뱅이 식 으로 다 중 스 레 드 상황 에서 동기 화 를 필요 로 한다.굶 주 린 사람 이 라 고 쓸 수도 있 지만 c++에 굶 주 린 사람 이 라 고 쓰 여 있 는 것 은 좋 지 않 습 니 다.여러 개의 사례 가 있 는데 그들 이 서로 인용 하면 굶 주 린 사람 이 문제 가 생 길 수 있 습 니 다.C++에서 이 몇 개의 단일 클래스 의 정적 구성원 의 초기 화 순 서 는 확실 하지 않 기 때문이다.
2.2B 의 Singleton

#include<iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton* getInstance();
    private:
        static Singleton* instance;
        Singleton()
        {
            cout<<"constructor
";
            // do something
        };
        ~Singleton()
        {
            cout<<"destructor
";
            //do something
        }
        class Garbo
        {
            public:
                ~Garbo()
                {
                    cout<<"Garbo destructor
";
                    if(Singleton::instance != NULL)
                        delete Singleton::instance;
                }
        };
        static Garbo garbo;
};
Singleton* Singleton::instance = NULL;
Singleton::Garbo Singleton::garbo;
Singleton* Singleton::getInstance()
{
    if(instance == NULL)
        instance = new Singleton();
    return instance;
}
int main()
{
    cout<<"begin main
";
    Singleton* instance = Singleton::getInstance();
    cout<<"end main
";
}
내부 류 인 가 보 를 사용 했다.main 이 끝나 면 자동 으로 garbo 를 방출 하기 때문에 garbo 는 instance 의 destructor 를 호출 합 니 다.
3.문예 싱글 톤

#include<iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton* getInstance();
    private:
        static Singleton instance;
        Singleton()
        {
            cout<<"constructor
";
            // do something
        };
        ~Singleton()
        {
            cout<<"destructor
";
            //do something
        }
};
Singleton Singleton::instance;
Singleton* Singleton::getInstance()
{
    return &instance;
}
int main()
{
    cout<<"begin main
";
    Singleton* instance = Singleton::getInstance();
    cout<<"end main
";
}
인 스 턴 스 는 main 이 시작 되 기 전에 이미 구성 되 어 있 으 며,main 이 끝 난 후에 자동 으로 방출 된다.
하지만 이렇게 되면 굶 주 린 남자 식 싱글 톤 일 수 밖 에 없다.만약 구조 함수 에서 대량의 자원 을 신청 해 야 한다 면 이 자원 들 은 전체 운행 단계 에 존재 할 것 이다.이런 자원 이 언제 필요 하 든,언제 필요 하지 않 든.
4.개 선 된 문예 싱글 톤

#include<iostream>
using namespace std;
class Singleton
{
    public:
        static Singleton* getInstance();
    private:
        Singleton()
        {
            cout<<"constructor
";
            // do something
        };
        ~Singleton()
        {
            cout<<"destructor
";
            //do something
        }
};
Singleton* Singleton::getInstance()
{
    static Singleton instance;
    return &instance;
}
int main()
{
    cout<<"begin main
";
    Singleton* instance = Singleton::getInstance();
    cout<<"end main
";
}
이렇게 하면 필요 할 때 singleton,즉 게으름뱅이 식 을 재 구성 할 수 있다.

좋은 웹페이지 즐겨찾기