지능 지침의 일종의 실현

1905 단어
std의 autoptr 인터페이스 구현
T* get()이 원래 포인터를 반환합니다.
void reset () 원시 포인터가 가리키는 대상 분석
T* operator -> () 원래 포인터로 돌아가기
T&operator*()가 원래 포인터가 가리키는 객체의 참조를 반환합니다.
T* release () 반환 시작 포인터 관리권
상기 기능 요구를 바탕으로 스마트 지침을 실현하는 것은 다음과 같다.
#pragma once

template<class T>
class smart_ptr{
public:
	//smart_ptr():m_p(0){}
	smart_ptr(T *p):m_p(p){}
	~smart_ptr();
	T* get() {return m_p;}
	void reset();
	T* release();
	T* operator -> () {return m_p;}
	T& operator *() {return *m_p;}
private:

	smart_ptr(smart_ptr &);   // declare copy constructor and operator = as private to avoid misuse smart_ptr
	smart_ptr& operator =(smart_ptr&);//
	T *m_p;
};

template<class T>
T* smart_ptr<T>::release()
{
	T* temp = m_p;
	m_p = 0;
	return temp;
}

template<class T>
void smart_ptr<T>::reset()
{
	if (m_p)
	{
		delete m_p;
		m_p = 0;
	}
}

template<class T>
smart_ptr<T>::~smart_ptr()
{
	reset();
}

테스트 클래스
class testClass
{
public:
	testClass(){cout<<"construction testClass"<<endl;}
	~testClass(){cout<<"destruction testClass"<<endl;}
	void print(){cout<<m_str<<endl;}
	string m_str;
};

테스트 코드
#include <stdio.h>
#include <tchar.h>
#include <string>
#include <ctime>
#include <map>
#include <iostream>
#include <algorithm>
#include "header.hpp"
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	smart_ptr<testClass> sp1(new testClass);
	
	sp1.get()->m_str = "111";
	sp1->print();
	(*sp1).m_str = "2222";
	sp1->print();

	//smart_ptr<testClass> sp2 = sp1;//compile error since copy constructor is declared as private

	testClass *p = sp1.release();
	delete p;
	return 0;
}

좋은 웹페이지 즐겨찾기