最后贴上接口基类的部分代码,实现过程太多就省略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&) { };
};