Hoon222y

[1219-4] 유일한 객체를 선언하는 방법 본문

코딩/교육

[1219-4] 유일한 객체를 선언하는 방법

hoon222y 2018. 12. 19. 23:33

유일한 객체를 생성하는 법

1. 사용자가 객체를 임의로 생성할 수 없도록 private 영역에 정의한다. 

2. 유일한 객체를 반환하는 정적 인터페이스를 제공한다. 

3. 복사를 금지하기 위해서 복사 생성자를 private 영역에 정의한다. 


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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#if 1
//유일한 객체를 생성하는 방법
#include <iostream>
using namespace std;
 
//운영체제가 제공하는 커서를 객체 지향적으로 구현한다고 가정한다.
class Cursor{
private:
    // step1. 사용자가 객체를 임의로 생성할 수 없도록 private 영역에 정의
    Cursor(){};
    
    //step2. 유일한 객체를 반환하는 정적 인터페이스를 제공한다.
    static Cursor* sInstance;
public:
    static Cursor* getInstance(){
        if (sInstance == 0)                     //이를 통하여 유일한 객체임을 체크
            sInstance = new Cursor;
        return sInstance;
    }
};
Cursor* Cursor::sInstance = 0;
 
int main(){
    Cursor* c1 = Cursor::getInstance();
    Cursor* c2 = Cursor::getInstance();
    cout << c1 << endl;
    cout << c2 << endl;
}
#endif
 
#if 0
//유일한 객체를 생성하는 방법
#include <iostream>
using namespace std;
 
//운영체제가 제공하는 커서를 객체 지향적으로 구현한다고 가정한다.
class Cursor{
private:
    // step1. 사용자가 객체를 임의로 생성할 수 없도록 private 영역에 정의
    Cursor(){};
    
    // step 3. 복사를 금지 하기 위해 복사 생성자를 private 영역에 정의한다.
    Cursor(const Cursor& o){}
    
    //step2. 유일한 객체를 반환하는 정적 인터페이스를 제공한다.
    static Cursor* sInstance;
public:
    static Cursor* getInstance(){
        if (sInstance == 0)
            sInstance = new Cursor;
        return sInstance;
    }
};
 
Cursor* Cursor::sInstance = 0;
 
int main(){
    Cursor* c1 = Cursor::getInstance();
    Cursor* c2 = Cursor::getInstance();
    
    cout << c1 << endl;
    cout << c2 << endl;
    
    //Cursor c3 = *c1;          //Cursor c3(*c1);
    //cout << &c3 << endl;
}
#endif
 
 
#if 0
#include <iostream>
using namespace std;
 
class Cursor{
private:
    Cursor(){};
    
    //step3. 복사를 금지하기 위해 복사 생성자를 private에
    //선!언!만 한다.
    //이 때, 링커에 의해 에러가 발생하므로 복사 생성자를 사용한 객체 생성은 할 수 없다.
    //Cursor c3 = *c1;          //Cursor c3(*c1); 이렇게 안된다는것이다.
    Cursor(const Cursor& o){}
    static Cursor* sInstance;
public:
    static Cursor* getInstance(){
        if (sInstance == 0)
            sInstance = new Cursor;
        return sInstance;
    }
};
 
Cursor* Cursor::sInstance = 0;
 
int main(){
    Cursor* c1 = Cursor::getInstance();
    Cursor* c2 = Cursor::getInstance();
    cout << c1 << endl;
    cout << c2 << endl;
    
}
#endif
 
#if 0
//유일한 객체를 생성하는 방법
#include <iostream>
using namespace std;
 
//싱글턴 패턴을 구현하는 방법
//1. 사용자가 객체를 임의로 생성할 수 없도록 기본 생성자를 private 영역에 정의한다.
//2. 유일한 객체를 반환하는 정적 인터페이스를 제공한다.
//3. 복사와 대입을 금지하기 위해 복사 생성자와 대입 연산자를 private 영역에 선언한다.
 
class Cursor{
private:
    Cursor(){};
    Cursor(const Cursor& o){}                   //커서의 선언부만 봐서는 복사 정책을 지하는지 아닌지를 모른다.
    //이러한 모호함을 없애기 위해서
    //c++ 최신 버전에서 Cursor(const Cursor& o) = delete 이렇게 작성하면 된다.
    
/*  아래와 같은 방식으로 해도 되고
    static Cursor* sInstance;
 public:
      static Cursor& getInstance(){               //참조로 리턴한다.
          if (sInstance == 0)
              sInstance = new Cursor;
         return *sInstance;                      //역참조
      }
 
 */
    
    //이러한 방식으로 해도 된다.
public:
    static Cursor& getInstance(){               //이게 최종적인 싱글턴 코드
        static Cursor sInstance;
        return sInstance;
    }
};
 
//Cursor* Cursor::sInstance = 0;
 
int main(){
    Cursor& c1 = Cursor::getInstance();     //전부 주소로 받아준다.
    Cursor& c2 = Cursor::getInstance();
    cout << &c1 << endl;
    cout << &c2 << endl;
    
    //delete c1;                        //이 코드가 에러가 나게 할 수 이쓴 방법은?
    //임의로 삭제할 수 없게 하려면 싱클톤 객체를 참조로 하게되면
    //참조는 멀티 쓰레드에서 안전하지 않다.
}
#endif
 
cs


Comments