출처 : http://egloos.zum.com/Lansi/v/4165048
싱글톤 패턴이란 인스턴스 생성을 단 하나만 생성하도록 제한하는 패턴을 말합니다.
인스턴스를 하나밖에 생성을 못 한다면 클래스가 무용지물이 될 수 있다고 생각할 수도 있습니다.
싱글톤 패턴은 나름대로 사용해야 할 곳이 있고, 장점이 있기 때문에 많이 쓰이고 있습니다.
예를들어, 데이터 관리 클래스가 있다고 할 때 그 데이터를 여러 클래스에서 써야하는데
데이터를 모두 공용으로 써야할 때 쓰입니다.
원리는 포인터를 하나 선언해주고 포인터가 NULL일 때 정적으로 인스턴스를 한 번만 생성해줍니다.
그리고 그걸 포인터에 넣어놓고 리턴 해주는 겁니다.
그 리턴값으로 정적으로 생성된 단 하나의 인스턴스에 접근해 사용하는거죠.
중요한 점은 정적으로 선언해야한다는 것과, 다른 클래스에서 생성자에 접근하지 못하게
private로 해줘야 된다는 것입니다.
CSingleton.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #pragma once class CSingleton { private: static CSingleton* pInstance; //정적 포인터 변수 CSingleton() {} //생성자는 꼭 private나 protected로 ~CSingleton() {} public: static CSingleton* GetInstance() //포인터 값을 리턴해주는 함수 { if (NULL == pInstance) //포인터가 NULL일 경우 { pInstance = new CSingleton(); //힙 영역에 동적 할당 후 포인터에 저장 } return pInstance; //포인터 리턴 } static void FreeInstance() //메모리 해제 { if (NULL != pInstance) //포인터가 비어있지 않다면 { delete pInstance; //메모리 해제 pInstance = NULL; } } }; CSingleton* CSingleton::pInstance = NULL; //클래스 밖에서 초기화 | cs |
싱글톤 클래스 예제입니다. CPP에 함수들을 따로 정의하면 오류가 납니다.
아래는 사용 방법입니다.
CTest.h
1 2 3 4 5 6 7 | class CSingleton; //싱글톤 클래스의 프로토 타입 class CTest { private: CSingleton *m_pSingleton; //포인터를 따로 저장해둘 변수 }; | cs |
데이터를 사용할 클래스의 헤더입니다.
여기서 중요한 점은 헤더에 싱글톤 클래스를 인클루드하면
중복 정의로 오류가 납니다.
CTest.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include "CTest.h" #include "CSingleton.h" //CPP 파일에 인클루드 CTest::CTest() { m_pSingleton = CSingleton::GetInstance(); //멤버 변수에 포인터에 따로 받아둡니다. } CTest::~CTest() { m_pSingleton->FreeInstance(); //종료시에는 메모리 해제 m_pSingleton = NULL; } | cs |
CPP 파일입니다. 여기다 싱글톤 클래스를 인클루드 해주면 오류가 나지 않습니다.
사용할 땐 m_pSingleton->멤버 함수() 이런 식으로 사용하면 되겠죠?
이렇게 만들어주시면 하나의 데이터를 여러 클래스가 공유하며 사용할 수 있게 됩니다.
'Programming > C&C++' 카테고리의 다른 글
VS2013 멀티바이트(MultiByte) 설정 사용하기 위한 준비단계 (0) | 2017.05.19 |
---|---|
CMake로 프로젝트 생성 후 프로젝트 INSTALL Error (0) | 2017.05.18 |
Visual Studio 2013 폴딩 접기/펴기 단축키 (0) | 2017.03.29 |
debug <=> release 모드의 차이점과 배포 (1) | 2017.03.17 |
오픈 소스 c++라이브러리 목록 (0) | 2016.11.17 |