设为首页 加入收藏

TOP

C++实现对象和接口的弱引用(三)
2013-05-03 18:17:55 来源: 作者: 【 】 浏览:154
Tags:实现 对象 接口 引用
 
 
  最后贴上接口基类的部分代码,实现过程太多就省略cpp文件了,贴出头文件以表明设计思路。强引用,弱引用,聚合接口查询,都支持了,强引用和弱引用都是以模板类型实现,而且各自可以独立使用。测试了一下两种避免声明成员变量的方法,在堆空间做统一管理会效率低下,重载new函数又会限制上层的开发自由,所以最后无奈还是选择声明一个成员变量,不过也懒得起名字了,用一个下划线表示,不希望被注意到,就这样好了。
 
interface_type.h
 
[cpp] view plaincopy
#ifndef __INTERFACE_TYPE_H  
#define __INTERFACE_TYPE_H  
  
//接口唯一标识类型。  
typedef long long TYPEID;  
  
const TYPEID TYPE_NULL = 0x0000000000000000;  
  
//接口函数返回类型。  
typedef short RESULT;  
  
const RESULT RESULT_OK = 0x0000;  
const RESULT ERR_UNKNOWN = 0xffff;  
const RESULT ERR_CONV_TYPE_FAILED = 0x1001;  
const RESULT ERR_ACCESS_NULL_ADDR = 0x1002;  
  
//接口类型基类。  
struct interface_type  
{  
private:  
    void* _;  
  
    //隐藏此函数以禁止创建实例数组。  
    void* operator new[](const size_t arr_size) throw(RESULT);  
  
    //隐藏此函数以禁止删除实例数组。  
    void operator delete[](void* arr_addr) throw(RESULT);  
  
protected:  
  
    //构造函数(仅继承类型可调用)。  
    interface_type();  
  
    //析构函数(仅继承类型可调用)。  
    virtual ~interface_type();  
  
public:  
  
    //使当前线程安全访问接口。  
    void sync_lock();  
  
    //结束当前线程的安全访问。  
    void sync_unlock();  
  
    //增加一次强引用。这将使强引用计数增加。  
    void add_safe_ref();  
  
    //把普通地址变量转换为弱引用变量。转换后的变量成为实例的一个弱引用。  
    void add_weak_ref(interface_type** ref_ptr);  
  
    //减少一次强引用。这将使强引用计数减少,当强引用计数减少至零时,对象就立刻被删除,相关的任何弱引用也将一起失效。  
    void safe_release();  
  
    //把弱引用变量转换为普通地址变量。转换后的变量被还原成普通的地址变量。  
    void weak_release(interface_type** ref_ptr, const bool clear_ref_ptr = false);  
  
    //请求指定的聚合接口。继承接口并重写此函数,以取得其它接口。  
    virtual RESULT query_type_t(const TYPEID type, interface_type **result)  
    {  
        //仅演示取得"interface_type"类型。  
        if(type == TYPE_NULL)  
        {  
            if(result != 0)  
            {  
                this->add_safe_ref();  
                if((*result) != 0)  
                {  
                    (*result)->safe_release();  
                }  
                (*result) = static_cast<interface_type*>(this);  
                return RESULT_OK;  
            }  
            else  
            {  
                return ERR_ACCESS_NULL_ADDR;  
            }  
        }  
        else  
        {  
            return ERR_CONV_TYPE_FAILED;  
        }  
    };  
};  
  
//继承终止模板。  
template<typename T> struct sealed_t  
{  
    friend T;  
private:  
    sealed_t() { };  
    sealed_t(const sealed_t&) { };  
};  

          

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇不使用sizeof, 计算int的位.. 下一篇C++中点操作符和箭头操作符

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: