C语言:类的声明和定义


 // 通用父类的定义
struct _virClass {
virClassPtr parent; unsigned int magic;
char *name;
size_t objectSize; virObjectDisposeCallback dispose;
};
typedef struct _virClass virClass;
typedef virClass *virClassPtr; //通用对象的定义
struct _virObject {
/* Ensure correct alignment of this and all subclasses, even on
* platforms where 'long long' or function pointers have stricter
* requirements than 'void *'. */
union {
long long dummy_align1;
void (*dummy_align2) (void);
struct {
unsigned int magic;
int refs;
} s;
} u;
virClassPtr klass;
}; struct _virObjectLockable {
virObject parent;
virMutex lock;
}; // 各个子类的声明与类对象指针的实例化
static int
virDataTypesOnceInit(void)
{
#define DECLARE_CLASS_COMMON(basename, parent) \
if (!(basename ## Class = virClassNew(parent, \
#basename, \
sizeof(basename), \
basename ## Dispose))) \
return -;
#define DECLARE_CLASS(basename) \
DECLARE_CLASS_COMMON(basename, virClassForObject())
#define DECLARE_CLASS_LOCKABLE(basename) \
DECLARE_CLASS_COMMON(basename, virClassForObjectLockable()) DECLARE_CLASS_LOCKABLE(virConnect);
DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
DECLARE_CLASS(virDomain);
DECLARE_CLASS(virDomainSnapshot);
DECLARE_CLASS(virInterface);
DECLARE_CLASS(virNetwork);
DECLARE_CLASS(virNodeDevice);
DECLARE_CLASS(virNWFilter);
DECLARE_CLASS(virSecret);
DECLARE_CLASS(virStream);
DECLARE_CLASS(virStorageVol);
DECLARE_CLASS(virStoragePool); DECLARE_CLASS_LOCKABLE(virAdmConnect);
DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData);
DECLARE_CLASS(virAdmServer);
DECLARE_CLASS(virAdmClient); #undef DECLARE_CLASS_COMMON
#undef DECLARE_CLASS_LOCKABLE
#undef DECLARE_CLASS return ;
}
//定义这些指针的用途就是后续需要创建子类的对象是作为类型参数传入,用来区分不同的对象实例。同时,也是最主要的,指定了子类的对象的内存分配大小。

C语言:按一个对象类型来new一个对象实例


 // 类似C++的new操作运算符。oh, my gold!
void *virObjectNew(virClassPtr klass)
{
// 声明父类指针,多态的开始么。。。
virObjectPtr obj = NULL;
// VIR_ALLOC_VAR 分配的内存大小为子类大小,指针的起始位置指向父类对象。
if (VIR_ALLOC_VAR(obj,
char,
klass->objectSize - sizeof(virObject)) < )
return NULL;
// 因为是C语言,所以需要手动初始化父类信息,magic指明这个子类跟父类是同一类
obj->u.s.magic = klass->magic;
obj->klass = klass;
virAtomicIntSet(&obj->u.s.refs, ); PROBE(OBJECT_NEW, "obj=%p classname=%s", obj, obj->klass->name); return obj;
}
// 如此,可以看一个子类的声明和分配例子:
virStreamPtr virGetStream(virConnectPtr conn)
{
virStreamPtr ret = NULL; if (virDataTypesInitialize() < )
return NULL; if (!(ret = virObjectNew(virStreamClass)))
return NULL; ret->conn = virObjectRef(conn);
return ret;
} struct _virStream {
virObject object;
virConnectPtr conn;
unsigned int flags; virStreamDriverPtr driver;
void *privateData;
};
typedef struct _virStream virStream;
typedef virStream *virStreamPtr; //当调用 virObjectNew(virStreamClass)的时候,virStreamClass的objectsize在CLASS_NEW的时候已经设置为sizeof(virStream)
//所以最后得到一个正确的(* virStreamPtr)对象实例。

最新文章

  1. 字符编码笔记:ASCII,Unicode和UTF-8(转载)
  2. C# 使用 fckeditor 上传文件中文名乱码的问题---转
  3. MySQL(三) 数据库表的查询操作【重要】
  4. [BZOJ 2957]楼房重建(THU2013集训)(分块思想)
  5. Ajax类库需要注意的问题
  6. 编写高质量代码改善C#程序的157个建议[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
  7. [转载] - QWidget、QMainWindow、QDialog和QFrame的区别
  8. 【转】用 SVN Importer 实现 CSVNT 到 SVN 的转换
  9. HDU 3364 Lanterns (高斯消元)
  10. poj 3159 Candies
  11. MAC 下cocos2d-x lua 使用dragonbones的方法
  12. Spring 4.0 中的 WebSocket 架构
  13. ajaxUploadFile在IE9等IE浏览器,上传变json下载的问题解决(SpringMVC + ajaxUploadFile)
  14. microsoft.jet.oledb.4.0 未注册
  15. Bootstrap之网格类
  16. 【英文文档】Solidifier for Windows Installation Guide
  17. Selenium+Java自动化之如何优雅绕过验证码
  18. [LeetCode] 824. Goat Latin_Easy
  19. Razor中的@:和语法
  20. [MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率

热门文章

  1. [RM 状态机详解1] RMApp状态机详解
  2. textarea定位光标
  3. MongoDB学习(翻译7)
  4. springMVC3学习(十二)--文件上传优化CommonsMultipartResolver
  5. js中getByClass()函数
  6. C# ToString格式控制符
  7. 内Cool超人
  8. Android 短信模块分析(二) MMS中四大组件核心功能详解
  9. vps使用(centos)2
  10. Java开发工具箱-JDK的安装与配置