程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第16章 模板與泛型編程(13)

第16章 模板與泛型編程(13)

編輯:C++入門知識

16.5 一個泛型句柄類

16.5.1 定義句柄類


#ifndef HANDLE_H  
#define HANDLE_H  
 
#include "stdafx.h"  
#include <iostream>  
 
using namespace std; 
 
template<class T> 
class Handle{ 
public: 
    Handle(T *p=0):ptr(p), use(new size_t(1)){} 
    T& operator*(); 
    T* operator->(); 
    const T& operator*() const; 
    const T* operator->() const; 
    Handle(const Handle& h):ptr(h.ptr), use(h.use){++*use;} 
    Handle& operator=(const Handle&); 
    ~Handle(){rem_ref();} 
private: 
    T* ptr; 
    size_t *use; 
    void rem_ref(){ 
        if(--*use==0){ 
            delete ptr; 
            delete use; 
        } 
    } 
}; 
 
template<class T> 
inline Handle<T>& Handle<T>::operator=(const Handle &rhs){ 
    ++*rhs.use; // to avoid "i=i"  
    rem_ref(); 
    ptr=rhs.ptr; 
    use=rhs.use; 
    return *this; 

 
template <class T> 
inline T& Handle<T>::operator*() 

    if(ptr) return *ptr; 
    throw std::runtime_error("dereference of unbound Handle"); 

 
template <class T> 
inline T* Handle<T>::operator->() 

    if(ptr) return ptr; 
    throw std::runtime_error("dereference of unbound Handle"); 

 
#endif 
#ifndef HANDLE_H
#define HANDLE_H

#include "stdafx.h"
#include <iostream>

using namespace std;

template<class T>
class Handle{
public:
 Handle(T *p=0):ptr(p), use(new size_t(1)){}
 T& operator*();
 T* operator->();
 const T& operator*() const;
 const T* operator->() const;
 Handle(const Handle& h):ptr(h.ptr), use(h.use){++*use;}
 Handle& operator=(const Handle&);
 ~Handle(){rem_ref();}
private:
 T* ptr;
 size_t *use;
 void rem_ref(){
  if(--*use==0){
   delete ptr;
   delete use;
  }
 }
};

template<class T>
inline Handle<T>& Handle<T>::operator=(const Handle &rhs){
 ++*rhs.use; // to avoid "i=i"
 rem_ref();
 ptr=rhs.ptr;
 use=rhs.use;
 return *this;
}

template <class T>
inline T& Handle<T>::operator*()
{
 if(ptr) return *ptr;
 throw std::runtime_error("dereference of unbound Handle");
}

template <class T>
inline T* Handle<T>::operator->()
{
 if(ptr) return ptr;
 throw std::runtime_error("dereference of unbound Handle");
}

#endif16.5.2 使用句柄


Handle<int> handle(new int(42)); 

    Handle<int> hp2=handle; 
    cout<<*handle<<" "<<*hp2<<endl; //42 42  
    *hp2=10; 

cout<<*handle<<endl; //10 
 Handle<int> handle(new int(42));
 {
  Handle<int> hp2=handle;
  cout<<*handle<<" "<<*hp2<<endl; //42 42
  *hp2=10;
 }
 cout<<*handle<<endl; //10使用Handle對象對指針進行使用計數


#include "Handle.h"  
class Age{ 
}; 
 
class Person{ 
private: 
    Handle<Age> age; 
}; 
#include "Handle.h"
class Age{
};

class Person{
private:
 Handle<Age> age;
};

摘自 xufei96的專欄
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved