在GObject对象中添加私有属性
来源:互联网 发布:ubuntu iso镜像下载32 编辑:程序博客网 时间:2024/06/08 06:50
添加的私有变量必然要涉及到更多的glib的宏,不过这里我们还无法进行分析,只是使用而已。
我们的程序设置了私有属性,一个是年龄,一个是名字,然后在类初始化函数中安装了属性,在实例初始化函数中设置了他们的初值。
新多了一个struct _SomeObjectPrivate 结构体,多了一个表示属性的枚举类型,多了some_object_set_property/some_object_get_property函数。等等啦。
#include<glib-object.h>#define SOME_OBJECT_TYPE(some_object_get_type())#define SOME_OBJECT(obj)(G_TYPE_CHECK_INSTANCE_CAST((obj), SOME_OBJECT_TYPE, SomeObject))#define SOME_IS_OBJECT(obj)(GTYPE_CHECK_TYPE((obj), SOME_OBJECT_TYPE))#define SOME_OBJECT_CLASS(c)(G_TYPE_CHECK_CLASS_CAST((c), SOME_OBJECT_TYPE,SomeObjectClass))#define SOME_IS_OBJECT_CLASS(c)(G_TYPE_CHECK_CLASS_TYPE((c), SOME_OBJECT_TYPE))#define SOME_OBJECT_GET_CLASS(obj)(G_TYPE_INSTANCE_GET_CLASS((obj), SOME_OBJECT_TYPE, SomeObjectClass))#define SOME_OBJECT_GET_PRIVATE(obj)(G_TYPE_INSTANCE_GET_PRIVATE((obj), SOME_OBJECT_TYPE, SomeObjectPrivate))typedef struct _SomeObjectSomeObject;typedef struct _SomeObjectClassSomeObjectClass;typedef struct _SomeObjectPrivateSomeObjectPrivate;struct _SomeObject {GObject parent_obj;SomeObjectPrivate *priv;};struct _SomeObjectClass {GObjectClass parent_class;};struct _SomeObjectPrivate {guint age;gchar *name;};enum {OBJECT_PROPERTY_0,OBJECT_PROPERTY_AGE,OBJECT_PROPERTY_NAME,};G_DEFINE_TYPE (SomeObject, some_object, G_TYPE_OBJECT)void some_object_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec){SomeObject *self = SOME_OBJECT(object);switch(property_id) {case OBJECT_PROPERTY_AGE:self->priv->age = g_value_get_uint(value);g_print("%s age: %d.\n",__func__, self->priv->age);break;case OBJECT_PROPERTY_NAME:g_free(self->priv->name);self->priv->name = g_value_dup_string(value);g_print("%s name: %s.\n", __func__, self->priv->name);break;default:G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);break;}}void some_object_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec){SomeObject *self = SOME_OBJECT(object);switch (property_id) {case OBJECT_PROPERTY_AGE:g_value_set_uint(value, self->priv->age);break;case OBJECT_PROPERTY_NAME:g_value_set_string(value, self->priv->name);break;default:G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);break;}}void some_object_dispose(GObject *gobject){SomeObject *slef = SOME_OBJECT(gobject);g_print("-- %s # %i\n",__func__, __LINE__);G_OBJECT_CLASS(some_object_parent_class)->dispose(gobject);}void some_object_finalize(GObject *gobject){SomeObject *self = SOME_OBJECT(gobject);g_free(self->priv->name);g_print("-- %s # %i\n",__func__, __LINE__);G_OBJECT_CLASS(some_object_parent_class)->finalize(gobject);}static void some_object_class_init(SomeObjectClass* g_class){g_type_class_add_private(g_class, sizeof(SomeObjectPrivate));GObjectClass *this_class = G_OBJECT_CLASS(g_class);GParamSpec *spec;g_print("-- %s # %i\n",__func__, __LINE__);this_class->dispose = &some_object_dispose;this_class->finalize = &some_object_finalize;this_class->set_property = &some_object_set_property;this_class->get_property = &some_object_get_property;spec = g_param_spec_uint("property-age", "the age","Set/Get age",0,150,0,G_PARAM_READWRITE);g_object_class_install_property(this_class, OBJECT_PROPERTY_AGE, spec);spec = g_param_spec_string("property-name", "the name","Set/Get name","no-name-set",G_PARAM_READWRITE);g_object_class_install_property(this_class, OBJECT_PROPERTY_NAME, spec);}void some_object_init(SomeObject *self){SomeObjectPrivate *priv;self->priv = priv = SOME_OBJECT_GET_PRIVATE(self);priv->age = 0;priv->name = g_strdup("no-name");g_print("-- %s # %i\n",__func__, __LINE__);g_object_set(G_OBJECT(self),"property-age",0,"property-name","no-name",NULL);}int main(){g_print("****init the type system****\n");g_type_init();g_print("****init type system OK ****\n");SomeObject *testobj = g_object_new(SOME_OBJECT_TYPE, NULL);;g_object_unref(testobj);g_print("****finish GObject Demo ****\n");return 0;}
下面是MAKEFILE
all:gcc `pkg-config --cflags --libs gobject-2.0` someobject.c -o test
最后是输出结果
****init the type system********init type system OK ****-- some_object_class_init # 97-- some_object_init # 125some_object_set_property age: 0.some_object_set_property name: no-name.-- some_object_dispose # 78-- some_object_finalize # 86****finish GObject Demo ****
通过输出结果我们可以看到调用的过程,以及私有变量的值被打印出来了。这里我们并没有涉及到在main中访问私有属性,因为这个是应该交给方法去做的。
方法~就是在class中注册的函数。下面我们将接触到‘方法’的方法。
- 在GObject对象中添加私有属性
- GObject 子类对象的私有属性模拟
- GObject 子类对象的私有属性模拟
- GObject的对象属性
- GObject 子类私有属性的外部访问
- GObject 子类私有属性的外部访问
- 用简单的方法来访问GObject对象的私有属性
- 用javascript在对象中添加属性
- GObject参考手册(10)--GObject的对象属性
- 在js中为对象添加和删除属性
- 在js中为对象添加和删除属性
- oc 在Appdelegate添加私有方法和属性
- 修改对象私有属性
- js 对象私有属性
- 开发中添加对象属性
- php对象的私有属性权限限制在类
- Alibaba FastJson支持对象中私有属性的json解析
- gtk对象系统与c++对象系统的综合比较、gobject对象系统、gobject的对象属性
- beginning visual c++ express edition
- 如何在MeeGo Qt应用程序中加载插件(一)
- Java读写cookie
- Asp.Net XML操作基类(修改,删除,新增,创建)
- PKG_CONFIG_PATH与LD_LIBRARY_PATH
- 在GObject对象中添加私有属性
- 警惕:冒充Google+ 让手机变成窃听器的恶意软件
- 用IHttpHandler添加水印效果
- oracle 查看 所有表 和 字段
- String StringBuffer StringBuilder
- WebKit内核源代码分析(二)
- 三洋电子办公管理系统
- Flex操作XML包括增删改查
- Vc6.0 调试指南 --Happy Debugging