在GObject对象中添加私有属性
2011-08-26 14:40
423 查看
添加的私有变量必然要涉及到更多的glib的宏,不过这里我们还无法进行分析,只是使用而已。
我们的程序设置了私有属性,一个是年龄,一个是名字,然后在类初始化函数中安装了属性,在实例初始化函数中设置了他们的初值。
新多了一个struct _SomeObjectPrivate 结构体,多了一个表示属性的枚举类型,多了some_object_set_property/some_object_get_property函数。等等啦。
下面是MAKEFILE
最后是输出结果
通过输出结果我们可以看到调用的过程,以及私有变量的值被打印出来了。这里我们并没有涉及到在main中访问私有属性,因为这个是应该交给方法去做的。
方法~就是在class中注册的函数。下面我们将接触到‘方法’的方法。
我们的程序设置了私有属性,一个是年龄,一个是名字,然后在类初始化函数中安装了属性,在实例初始化函数中设置了他们的初值。
新多了一个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 _SomeObject SomeObject; typedef struct _SomeObjectClass SomeObjectClass; typedef struct _SomeObjectPrivate SomeObjectPrivate; 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 # 125 some_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 子类对象的私有属性模拟
- Javascript 中动态添加 对象属性
- JavaScript中对象的创建方法与属性的添加
- ObjectForScripting 的类必须对 COM 可见。请确认该对象是公共的,或考虑向您的类添加 ComVisible 属性。
- object-c计划tips-添加到类对象属性
- java通过反射设置对象私有属性
- C#添加属性快捷键、类和对象
- 201510250817_《Javascript权威指南(第六版)——属性描述符、模块、命名空间对象、私有空间命名的函数》(P244-252)
- javascript面向对象(对象的创建以及属性和方法的添加)
- vuex属性添加对象
- javascript: 高级技巧: window 对象也可以添加自定义属性, 无须等加载完毕
- {}、:、[]、.的用法、动态给对象添加和删除属性、遍历对象的属性
- 使用new调用构造器创建对象并统一添加属性的代码运行过程
- 遍历json 对象的属性并且动态添加属性的实现
- 给js对象添加新属性的方法
- Javascript创建自定义对象 创建Object实例添加属性和方法
- php对象的私有属性权限限制在类
- python中类的用法(对象的私有属性)