Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57667
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-09 21:53
文章分类
文章存档

2011年(1)

2009年(17)

我的朋友

分类: LINUX

2009-02-24 00:33:44

1.元对象 

  元对象被称做是meta object.在运行时刻(runtime),能够提供对象的运行时信息。

  在C++语言发展的早期,C++语言本身没有定义对象的运行时信息,如输出类的名称,父类的名称,判断对象的继承关系等等。虽然新的C++语言增加了RTTI,但还是不够的。这些信息在面向对象编程和调试程序过程中是非常有用的。因此不同的类库采取了不同的方式来扩展语言。
  MFC的实现方式是宏定义:如DECLARE_DYNAMIC,DECLARE_DYNCREATE,DECLARE_SERIAL。这种实现方式没有扩展语言本身,因此可以不加处理的兼容所有的C++编译器。
  QT的实现方式是宏定义加moc编译,定义宏Q_OBJECT,并对语言本身做了部分扩展,因此需要用QT的moc编译器特殊处理一下,产生一个moc_XXX.cpp的文件,然后就可以使用通用C++编译器编译了。
 Q_OBJECT的定义如下:
#define Q_OBJECT \
public: \
  virtual QMetaObject *metaObject() const { \
  return staticMetaObject(); \
  } \
  virtual const char *className() const; \
  virtual void* qt_cast( const char* ); \
  virtual bool qt_invoke( int, QUObject* ); \
  virtual bool qt_emit( int, QUObject* ); \
  QT_PROP_FUNCTIONS \
  static QMetaObject* staticMetaObject(); \
  QObject* qObject() { return (QObject*)this; } \
  QT_TR_FUNCTIONS \
private: \
  static QMetaObject *metaObj;
 
 从定义上看,QT的元对象信息主是通过QMetaObject对象来管理的,每一个类都会增加一个static QMetaObject *metaobj。QMetaObject中包含三部分信息:
 (1)className,superclassname
  这是用来判断对象的继承关系的,是实现QObject::isA(const char *classname)和QObject::inherits(const char *classname)的基础。
 (2)用来实现Q_PROPERTY的property信息。
 (3)用来实现signal/slot的信息


阅读(1057) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~