我们先从Obotcha最base的类Object开始介绍。
Object头文件位于lang/include/Object.hpp,同java相同,所有的类都是Object的子类。Object包含了以下几个函数
1.inline void incStrong(__attribute__((unused)) const void* id) //用于引用计数+1
2.inline int decStrong(__attribute__((unused)) const void* id) //用于引用计数+1
3.inline int32_t getStrongCount() //获取引用计数
4.inline virtual bool equals(const Object *m) //比较函数
5.inline virtual bool equals(Object &m) //比较函数
incStrong/decStrong主要是为了实现智能指针计数。如果大家看过android相关的书籍或者介绍,应该对android的智能指针有所了解,Obotcha的智能指针基本是仿照了Android的方式实现的。
equals比较函数是为了之后实现类的== operator接口才添加的,子类如果希望修改比较方法,可以直接复写equals。同java的equals很相似。
Object.hpp中除开了Object类的声明,还有几个非常重要的Class声明宏:
//Y:class名字
//U:模版个数
#define DECLARE_CLASS(Y,U) \
CLASS_PRE_DEF_##U(Y); \
TYPE_DEF_##U(Y); \
MAKE_FUNCTION_##U(Y) \
TEPMLATE_DECLARE_##U \
class _##Y: virtual public Object\
#define DECLARE_SIMPLE_CLASS(Y) DECLARE_CLASS(Y,0)
Obotcha中,所有的Class申明都需要调用这个2个宏来申明(当然,你直接用class xxx也可以)。使用这2个宏申明的class,就自动会实现智能指针的功能。如果使用上述2个宏申明了class,那我们的实例生成就需要使用createXXX(XXX是class名)即可。createXXX函数是通过MAKE_FUNCTION_##U这个宏自动生成的。
//无模版参数
#define MAKE_FUNCTION_0(Y) \
template<typename... Args>\
sp<_##Y> create##Y(Args&&... args)\
{\
sp<_##Y> ret = new _##Y(std::forward<Args>(args)...);\
return ret;\
}\
//1个模版参数
#define MAKE_FUNCTION_1(Y) \
template<typename T,typename... Args>\
sp<_##Y<T>> create##Y(Args&&... args)\
{\
sp<_##Y<T>> ret = new _##Y<T>(std::forward<Args>(args)...);\
return ret;\
}\
从上面的宏可以看到,实际上Obotcha的create函数是调用了_Class的new来创建的实例。就是说,如果你调用了DECLASS_CLASS(student,0),那Obotcha会先声明一个_student类,然后通过下面的宏:
#define TYPE_DEF_0(YY) typedef sp<_##YY> YY
把sp<_student>重命名成student,这样一个student类就定义完成了。
相关代码如下:
https://github.com/wangsun1983/Obotcha/blob/master/lang/include/Object.hpp