C++ 싱글톤 템플릿 관련해서 궁금한 점이 있습니다.
글쓴이: tjdwn0406 / 작성시간: 목, 2014/10/09 - 8:37오전
보통 아래 코드와 같이 cSingleton클래스를 상속해서 사용하는 방식으로 알고 있습니다.
여기서 제가 궁금한 점은 실제 1개의 객체만 생성하고 싶은 클래스는 아래 코드에서 cTest 클래스인데요,
근데 그냥 cTest* pT = new cTest(); 이런식으로도 객체가 생성이 되긴 합니다;
사실 싱글톤이라는 개념이 강제적으로 1개의 객체만 만들도록 하는걸로 알고있는데 이렇게 되면 싱글톤이 깨지는 거 아닌가요?
제가 뭘 잘못 알고있는거지 궁금합니다..
template<class T> class cSingleton { protected: cSingleton() { ...(생략) } ~cSingleton() { ...(생략) } public: static T* GetInstance() { if( m_pInstance == NULL ) m_pInstance = new T; return m_pInstance; } static void DeleteInstance() { if( m_pInstance != NULL ) delete m_pInstance; m_pInstance = NULL; } private: static T* m_pInstance; }; template <class T> T* cSingleton<T>::m_pInstance = NULL; class cTest : public cSingleton<cTest>{ private: int val; public: int GetValue() { return val; } }; int main() { cTest* pT = cTest::GetInstance(); //cTest* pT = new cTest(); 이렇게도 객체 생성 가능?? int i = pT->GetValue(); return 0; }
Forums:
말씀하신대로 싱글톤은 어플리케이션에서 하나의 인스턴스만 존재하는게 맞습니다.
생성자 함수 내용이 생략되어 뭐라 말쓴드리긴 애매하지만서도
생성자 함수에서 getInstance가 호출이 되면 싱글톤이죠..
포인터 값 확인하면 둘이 같은 겁니다.
생략이라도 쓰긴했지만 서도 실제로 돌릴땐 아무것도
생략이라도 쓰긴했지만 서도 실제로 돌릴땐 아무것도 안넣었습니다.
말씀하신 생성자함수에서 getInstance가 호출이 된다고 하셨는데 그게 무슨말인지 잘모르겠네요 ;;
cSingleton() { GetInstance(); } 이렇게돌려봤는데 GetInstance함수가 무한루프로 호출되더라고요
좀더 자세한 설명좀 부탁드립니다..(꾸벅)
아래 돌려 보셨나요? cTest* pT = new
아래 돌려 보셨나요?
추측만으로 질문하지 마세요. 컴파일 에러 납니다.
왜 에러나는지 생각해보세요.
컴파일러 에러 멧세지가 불친절하다고 느껴지신다면
힌트 Access Modifier: protected
죄송합니다. C++을 오랜만에 봐서 제가
죄송합니다.
C++을 오랜만에 봐서 제가 실수했습니다.
원하시는 결과를 얻으려면
막 템플릿 배우는 사람입니다.
이게 템플릿의 경우에는 friend cSingleton; 를 해주지 않으면 서로 private 함수를 보지 못한다는 의미 맞나요?
구지 템플릿의 경우가 아니더라도 일반적으로 그렇지
구지 템플릿의 경우가 아니더라도 일반적으로 그렇지 않나요??;
저도 템플릿은 잘 몰라서..
friend 넣어서도 해봤는데 cTest()함수가
friend 넣어서도 해봤는데 cTest()함수가 막혀서 컴파일 에러나옵니다;;
이상하네요 friend까지 넣었으면 cTest()생성자가 막히면 안되는건데 왜 에러가 나지?
뭔가 다른 방법이 정녕 없는걸까요 ㅠㅠ
아.. 제 실수군요 원하던 결과가 되긴되네요.. 근데
아.. 제 실수군요 원하던 결과가 되긴되네요.. 근데 friend를 넣으면 뭔가 찜찜해서;;
그러면 궁금한게.. 그런식으로 사용할려면 friend를 넣는다던가.. 아무튼 cTest()생성자를 private에 넣어서
단순히 cTest* pT = new cTest(); 이런식으로 생성이 안되게 써야한다는건데 인터넷에 올려진 예제들 보면
따로 그런 추가 코드는 안보이더라고요, 원래 다들 그런식으로 쓰는건가요?
혹시 실무에서 템플릿으로 싱글톤쓰시는분들은 어떤식으로 쓰는지 궁금합니다.
템플릿을 이용해서 싱글턴 패턴을 구현하는 것은 별로
템플릿을 이용해서 싱글턴 패턴을 구현하는 것은 별로 추천해드리고 싶지 않습니다.
표준 문법만으로 싱글턴 클래스를 구현하는 것이 가능할 것 같지 않네요.
그냥 싱글턴 클래스를 다음과 같이 구현하시는 편이 더 낫을 것 같습니다.
덧붙이자면, 본문에 사용하신 코드는 Thread safe하지 않습니다. Double locking pattern을 적용해도 그렇습니다.
gilgil.net
1. cSingleton에서 protected로 상속받기.
2. cTest 클래스에서 ctor 및 drot를 protected나 private로 선언하기
등의 방법이 있을 수 있겠습니다.
kukyakya님도 말씀하셨지만 template를 이용한 singleton을 구현은 비추입니다. 저도 결국 case by case로 구현하도록 수정하였습니다.
singleton 클래스에 대해 정리한 것이 있으니 참고하시기 바랍니다.
singleton 클래스 이야기(1) http://www.gilgil.net/15751
singleton 클래스 이야기(2) http://www.gilgil.net/15772
singleton 클래스 이야기(3) http://www.gilgil.net/15792
singleton 클래스 이야기(4) http://www.gilgil.net/15809
www.gilgil.net
답변 감사드립니다. 싸이트에서도 이런저런 글들좀
답변 감사드립니다. 싸이트에서도 이런저런 글들좀 읽다가 가네요 ㅎ
댓글 달기