모든 클래스에 적용 가능하며
상속만 받으면 싱글턴이 되는 그런 꿈의 클래스 템플릿...
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 | template <class T> class SingletonBase { protected: SingletonBase(){ ; } ~SingletonBase(){ ; } public: static T* Instance(){ if(instance == nullptr) { instance = new T; //T의 생성자에 어떻게 접근할 것인가? friend 밖에 없나? } return instance; } static void destroyInstance(){ if(instance == nullptr) { delete instance; //T의 소멸자엔 또 어떻게 접근할 것인가? instance = nullptr; } } private: static T* instance; SingletonBase(const SingletonBase&); SingletonBase& operator=(const SingletonBase); }; template <class T> T* SingletonBase<T>::instance = nullptr; | cs |
사용법?
1 2 3 4 5 6 7 8 9 | class Projector: public SingletonBase<Projector> { friend class SingletonBase<Projector>; // !!!! ... private:
Projector(){ ; } //매개변수 있는 생성자는 사용 불가
~Projector(){ ; } ... }; | cs |
내가 만든 건 friend 안 쓰면 안되는데..
이거 써도 되는건지 찝찝하기 짝이 없다
슈퍼클래스에서는 서브클래스의 생성자/소멸자를 사용해야되는데
외부에서는 서브클래스의 생성자를 쓰면 안 된다!!
답은 friend뿐인가?
위에 17라인 == 를 !=로
삼촌 //왜죠?
게임에서 객체를 관리하는 클래스가 있는데 하나 이상 생기면 안 되고 그 안에 든 객체 수정도 해야되고 해서..
엥? 음.... 그런가...?
제가 지난번에 "싱글톤을 논리적으로 하나의 인스턴스만 존재해야하는 클래스에 적용한다"라는 댓글을 달았는데 백왕인가 누군가가 한심하다고 댓글을 달더군요. 설명좀
맞는거 아닌가
프갤 현업중에서 싱글톤 좋아하는 사람을 본적이 없는것같음
멀티쓰레딩하면 문제가 생긴다는데 쓰레드를 몰라서 모르겠으음
싱글톤은 N개의 객체만 생산가능하고 핵심은 외부에서 생성을 제한하는거지..
그냥 static객체라고 생각하니까 싱글톤이 필요없다고 생각하는겨
티나 // 남발하는 경우가 많아서 그런거 아닐지 -_-; 마치 전역변수마냥 그리고 ㅊㄹ가 말하는 상황에서는 singleton이 적합하다고 생각함
인스턴스 만들때 락을 걸어야져
그런데, 제 코드는 문제가 없는 건가여.. 불-안
ㅊㄹ//님같은 생각 누구나 다 해봄..나도 이미 하고있고 실무에서도 실제로 나도 님처럼 템플릿 싱글톤 만듬....
흐음 그렇군요
이 코드야 말로 멀티스레드에서 쓰면 안되는 코드네