모든 클래스에 적용 가능하며

상속만 받으면 싱글턴이 되는 그런 꿈의 클래스 템플릿...


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뿐인가?