如何优雅的写C++代码 Obotcha介绍(Object类)

本文深入介绍了Obotcha框架的基础类Object,详细解析了其智能指针实现原理及类声明宏,展示了Obotcha如何通过宏实现类的智能指针功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  我们先从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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值