句柄类及其使用举例

由于c++不支持对象的动态多态,只有指针或引用支持动态多态。所以,使用一个句柄类(只包含指针数据成员)来支持对象的多态性

句柄的使用一般包含如下两种情况:对象的多态性和对象的共同计数

源代码如下:
#include <iostream>

using namespace std;

class point
{
public:
    point():x_cdt(0),y_cdt(0){}
    point(int x,int y):x_cdt(x),y_cdt(y){}
    int get_x()
    { return x_cdt;}
    int get_y()
    { return y_cdt;}
    point& set_x(int x)//·µ»ØÖµÊÇpoint&ÊÇΪÁËʵÏÖÕâÑùµÄ±í´ï: p.set_x(2).set_y(4);
    {                 
        
        x_cdt = x;
        return *this;
    }
    point& set_y(int y)
    {
        y_cdt = y;
        return *this;
    }
    virtual point* clone()const{//cloneº¯Êý£¬ÊéP507 
            cout<<"»ùÀ๹Ôì"<<endl;
        return new point(*this);
    }
    virtual void print() const//Ð麯Êý£¬ÒÔ±»¶¯Ì¬µ÷Óà
    {
       
        cout<<"»ùÀà´òÓ¡"<<endl;
    }
    
private:
    int x_cdt,y_cdt;
};

class d_point:public point{  //¼Ì³ÐÀà
    int d;
public:
    d_point(point p):point(p)
    {
        d=0;
    }
    d_point* clone() const //ÖØдcloneº¯Êý£¬ÊéP507 
    {
        cout<<"ÅÉÉúÀ๹Ôì"<<endl;
        return new d_point(*this);
    }
    void print()const  //ÖØдÐ麯Êý£¬ÒÔ±»¶¯Ì¬µ÷Óà
    {
        cout<<"ÅÉÉúÀà´òÓ¡"<<endl;
    }
};

//

class usecount
{
public:
    friend class handle;
    usecount():p(new int(1)){}
    usecount(const usecount& h):p(h.p)//pºÍh.pÏàͬ£¬Òâζ×ÅpºÍh.pÖ¸ÏòͬһÄÚ´æ £¬Öص㰡£¬Í³Ò»¼ÆÊýÔ­Àí 
    {
       ++*p;
    }
    // usecount& operator=(const usecount&);
    ~usecount()
    {
        if(--*p == 0)
            delete p;
    }

private:
    bool reattach(const usecount&h);
    int* p;
};


bool usecount::reattach(const usecount&h)
{
    ++*h.p;
    if(--*p == 0){
        delete p;
        p = h.p;
        return true;
    }
    p = h.p;
    return false;
    
}
///

class handle
{
public:
    handle():ptr(0){}
    handle(const point &p):ptr(p.clone()){}
    handle(int x,int y):ptr(new point(x,y)){}
    handle(const handle& h):ptr(h.ptr),u(h.u){}
    handle& operator=(const handle& h);
    ~handle(){
        if(--(*u.p) == 0)
            delete ptr;
    }
    int handle_count()//Á¬½Óµ½count_pointµÄÊýÄ¿
    {
        
        return *u.p;
    
    }
    
    void print()
    {
         ptr->print();                
    }
private:
    point* ptr;
    usecount u;//¸Ä³ÉÕâ¸ö
};

handle& handle::operator=(const handle& h)
{
    if(u.reattach(h.u))
        delete ptr;
    ptr = h.ptr;
    return *this;
}


int main( )
{
    
    point p1(1,1);
    d_point dp1(p1);
    cout<<"ÓûùÀà³õʼ»¯!"<<endl; 
    //count_point cp1(p1);
    handle h1(p1);
    handle h2(h1);
    handle h3(h1);
    h1.print();
    cout<<h1.handle_count()<<endl;
    
    cout<<"ÓÃÅÉÉúÀà³õʼ»¯!"<<endl; 
    handle h11(dp1);   //¿ÉÒÔ½ÓÊÜÅÉÉúÀà¶ÔÏó£¨Í¨¹ý»ùÀàÖ¸Õ붯̬°ó¶¨£©
    handle h12(h11);
    handle h13(h11);
       h11.print();  //¶ÔÏóµÄ¶à̬ÐÔ 
    cout<<h11.handle_count()<<endl;
    ///
    
    

    
    int a;
    cin>>a;
    return 0;
}


/*class handle
{
public:
handle();
handle(int x,int y);
handle(const point&);
handle(const handle&);
handle& operator=(const handle&);
~handle();
private:
point* operator->();
}*/
//

/*
ÎÒÃÇÔÝʱûÓаÑset_x£¨£©ÕâÑùµÄ³ÉÔ±ÏȼÙÈçµ½ÕâÀΪÁ˼ò±ã¡£
µ±ÎÒÃÇдÍêÖ®ºó£¬ÎÒÃÇÓÖÓöµ½ÁËʱ¿ÌÀ§ÈÅÎÒÃǵÄÎÊÌ⣬¾ÍÊǶÔÏóµÄɾ³ý£¬¼ÈÈ»ÎÒÃÇÔÊÐí°ÑÒ»¸ö¶ÔÏó°ó¶¨µ½¶à¸öhandleÉÏ£¬
µ±ÆäÖеÄÒ»¸öhandleɾ³ýµÄʱºò£¬Õâ¸ö¶ÔÏó»áÔõôÑùÄØ£¿Õâ¸öÎÊÌâÊÇÒª½â¾öµÄ¡£ÕâÀÎÒÃÇÄØÒýÈëÁËÒýÓüÆÊýµÄ¸ÅÄ
ºÜÏÔÈ»£¬ÎÒÃDz»ÄÜ°ÑÕâ¸öÒýÓüÆÊý·Åµ½ÎÒÃǵÄhandleÀàÖУ¬ÒòΪһµ©ÎÒÃÇÕâô×öÁË£¬µ±ÎÒÃÇÓÃÒ»¸öhandle°ó¶¨µ½Ò»¸ö¶ÔÏóµÄʱºò£¬
Ëû±ØÐëÖªµÀÆäËûËùÓа󶨵½Õâ¸ö¶ÔÏóµÄhandleµÄÒýÓüÆÊý£¬È»ºó¸üÐÂÕâ¸ö¼ÆÊý£¬Õâ·Ç³£À§ÄÑ¡£
ÄÇôÈç¹ûÎÒÃÇ°ÑÕâ¸öÒýÓüÆÊý·Åµ½¶ÔÏó±¾ÉíÄØ£¿ÉÔ΢˼¿¼Ò»Ï¾ÍÖªµÀÒ²ÊDz»ºÏÀíµÄ£¬ÕâÑù×öÒâζ×ÅÎÒÃÇÿ´Î¶¼Òª¸Äд¶ÔÏó¡£
ËùÒÔ£¬×ÛÉÏ¿¼ÂÇ£¬ÎÒÃǾö¶¨Ð´Ò»¸öеÄÀàÀ´´æ·ÅÕâ¸öÒýÓüÆÊý£¬Õâ¸öÀàÊÇÍêȫΪÁ˼¼ÊõµÄʵÏÖÉè¼ÆµÄ£¬
ËùÒÔÎÒÃÇ°ÑËûµÄËùÓгÉÔ±ÉèÖóÉprivate£¬¶øÈÃhandle³ÉΪËûµÄÓÑÔªÀ࣬¾ßÌåÊÇÕâÑùµÄ£º
class count_point//³õʼ°æ±¾
{
friend class handle;
point p;
int count;
count_point();
count_point(int x,int y);
count_point(const count_point&);

};*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值