#include<iostream>
using namespace std;
//1. template 로 만들게 된다!! 당근이징
//2. 얕은 복사를 해결 해야 한다.
// (A) 깊은 복사
// (B) 참조 계수
// (C) 소유권 이전
// (D) 복사금지
/*
template <typename T>class ptr{
T *obj;
public:
ptr(T *p=0):obj(p){}
T *operator->(){return obj;}
T& operator*() {return *obj ;}
~ptr(){delete obj;}
};
//
int main(){
ptr<int> p1 = new int;
*p1 = 10;
cout << *p1 << endl;
}
*/
/*
////////////////////////// 복사 금지 ///////////////////////////////
// boost 의 scoped_ptr<> 이 이정책을 사용한다.
//장점 : 가볍다.
//단점 : 단지 자원곤리만 책임지고 대입 , 복사등이 불가능하다.
////////////////////////////////////////////////////////////////////
template <typename T>class scoped_ptr{
T *obj;
scoped_ptr(const scoped_ptr &p);
void operator = (const scoped_ptr &p);
public:
scoped_ptr(T *p=0):obj(p){}
T *operator->(){return obj;}
T& operator*() {return *obj ;}
~scoped_ptr(){delete obj;}
};
//void foo(scoped_ptr<int> p2); //불편함
int main(){
scoped_ptr<int> p1 = new int;
*p1 = 10;
cout << *p1 << endl;
//ptr<int> p2= p1; /// 컴파일 에러!! 절대 이렇게는 사용하지 마시요~ 라는 뜻
}
*/
/*
//////////////////////////////////////// 소유권 이전 ///////////////////////////////
//#include<memory> // 이안에 auto_ptr 이 있다!!
//
/////////////////////////////////////////////////////////////////////////////////////
template <typename T>class Auto_ptr{
T *obj;
public:
//소유권 이전의 전략
Auto_ptr(ptr & p): obj(p.obj){
p.obj=0;
}
Auto_ptr(T *p=0):obj(p){}
T *operator->(){return obj;}
T& operator*() {return *obj ;}
~Auto_ptr(){delete obj;}
};
//void foo(scoped_ptr<int> p2); //불편함
int main(){
Auto_ptr<int> p1 = new int;
*p1 = 10;
cout << *p1 << endl;
Auto_ptr<int> p2= p1; //이제 자원은 p2만 사용한다 (소유권 이전)
//cout << * p1 < endl;//error
cout << *p2<<endl; // ok
}
*/
/////////////////////////////////// 참조 계수 /////////////////////////////////////
// boost 에서 만들고 STL 에 새롭게 추가된 shared_ptr 입니다.
/////////////////////////////////////////////////////////////////////////////////////
template <typename T>class Auto_ptr{
T *obj;
int *pRef;
public:
//참조계수 전략
Auto_ptr(T *p=0):obj(p){
pRef = new int(1);
}
ptr(const ptr &p):obj(p.obj),pRef(p.pRef){
++(*pRef);
}
T *operator->(){return obj;}
T& operator*() {return *obj ;}
~Auto_ptr(){
if(--(*pRef)==0){
dlete obj;
delete pRef;
}
}
};
//void foo(scoped_ptr<int> p2); //불편함
int main(){
Auto_ptr<int> p1 = new int;
*p1 = 10;
cout << *p1 << endl;
Auto_ptr<int> p2= p1; //이제 자원은 p2만 사용한다 (소유권 이전)
//cout << * p1 < endl;//error
cout << *p2<<endl; // ok
}
'C,C++ > Android_FrameWork' 카테고리의 다른 글
[SSM 안드로이드 프레임워크 개발 강의]15. STL find, strchr 구현하기 (0) | 2012.08.14 |
---|---|
[SSM 안드로이드 프레임워크 개발 강의]14-3.실제로 안드로이드 프레임웤에서 사용되는 스마트 포인터 (0) | 2012.08.14 |
[SSM 안드로이드 프레임워크 개발 강의]14-1.스마트 포인터 (0) | 2012.08.14 |
[SSM 안드로이드 프레임워크 개발 강의]13.연산자 재정의와 테크닉 (0) | 2012.08.14 |
[SSM 안드로이드 프레임워크 개발 강의]12-1 얕은 복사의 4가지 기법 (0) | 2012.08.14 |