計數指標,源碼雛形

來源:互聯網
上載者:User

跟auto_ptr對照一下,auto_ptr複製或轉移擁有權,看看計數指標有什麼不同,看看計數指標是怎麼實現的?

#include<iostream>#include<string>#include<deque>#include<algorithm>#include<vector>#include<list>using namespace std;template<typename T>class CountedPtr{private:T* ptr;long *count;public:explicit CountedPtr(T* p=0):ptr(p),count(new long(1)){}CountedPtr(const CountedPtr<T>& p)throw():ptr(p.ptr),count(p.count){++*count;}~CountedPtr()throw(){dispose();}CountedPtr<T>& operator=(const CountedPtr<T>& p)throw(){if(this!=&p){dispose();ptr=p.ptr;count=p.count;++*count;}return *this;}T& operator*()const throw(){return *ptr;}T* operator->()const throw(){return ptr;}private:void dispose(){if(--*count==0){delete count;delete ptr;}}};void dayin(CountedPtr<int> elem){cout<<*elem<<" ";}int main(){static int values[]={3,5,9,1,6,4};typedef CountedPtr<int> InPtr;deque<InPtr>d;list<InPtr>l;for(int i=0;i<sizeof(values)/sizeof(*values);++i){InPtr ptr(new int(values[i]));d.push_back(ptr);l.push_front(ptr);}for_each(d.begin(),d.end(),dayin);cout<<endl;for_each(l.begin(),l.end(),dayin);cout<<endl;*d[2]*=*d[2];(**d.begin())*=-1;(**d.begin())=0;for_each(d.begin(),d.end(),dayin);cout<<endl;for_each(l.begin(),l.end(),dayin);cout<<endl;system("pause");return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.