Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 그리디 알고리즘
- BFS
- BOJ 2098
- 성화봉송
- 인간이 그리는 무늬
- 이분탐색
- lower_bound
- 다음 API
- 다음 지도 api
- boj
- 위상정렬
- upper_bound
- 삼성 코딩테스트
- 생활코딩
- 다이나믹 프로그래밍
- 언어의 온도
- 비트마스크
- 백트레킹
- 캘리그라피
- MST
- 평창동계올림픽
- DP
- 안드로이드 스튜디오
- 성화봉송주자
- yolo
- multiset
- 외판원 순회
- Segment Tree
- 창훈쓰다
- 영어회화 100일의 기적
Archives
- Today
- Total
Hoon222y
[1219-4] 유일한 객체를 선언하는 방법 본문
유일한 객체를 생성하는 법
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 |
'코딩 > 교육' 카테고리의 다른 글
[1220-1] friend 키워드 (0) | 2018.12.20 |
---|---|
[1219-5] 상수 멤버 함수 / mutable (0) | 2018.12.20 |
[1219-3] 정적 멤버 - 정적 멤버 함수 / 함수 포인터 (0) | 2018.12.19 |
[1219-2] 정적 멤버 - 정적 멤버 변수/ 선언과 정의 (0) | 2018.12.19 |
[1219-1] 정적 멤버 - this와 thiscall (0) | 2018.12.19 |
Comments