`
cloverprince
  • 浏览: 127403 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GObject 02: A classed type

阅读更多
Now I am going to create a classed type.

Q: What is a class?
A: I don't know for sure.  In object-oriented programming, a class represents a "kind" of data.  It specifies what data there is (the members/fields) in each object (instance) and what can be done (the methods) to the object.

Q: What is a "classed" type in GObject?
A: It is a type that has a "class struct".

Each "classed type" has a unique instance of "class structure".  Note that IN GOBJECT, THERE IS A DIFFERENCE BETWEEN A "Class" AND AN "Instance".  A "Class" IS SOMETHING THAT IS SHARED BY ALL OBJECTS OF A CLASS AND AN "Instance" IS SOMETHING THAT IS SPECIFIC TO EACH OBJECT OF THE CLASS.  You can imagine that whatever in a "Class" are like the static members/fields in C++/Java and whatever in an "Instance" are like non-static members/fields.

The code is here:
/* A fundamental type.  It has a class structure, but is not instantiable. */

#include <stdio.h>
#include <glib-object.h>

typedef struct {
    GTypeClass something_as_boilerplate;
    int foo;
    char* bar;
    void (*baz)();
} myclass_t;

void baz_function() { printf("All your type are belong to us!\n"); }

void my_class_init_func(myclass_t* klass, gpointer data) {
    printf("my_class_init_func called!\n");
    klass->foo = 42;
    klass->bar = "Hello world!";
    klass->baz = baz_function;
}

int main() {
    g_type_init();

    GTypeInfo my_type_info = {
        sizeof(myclass_t),  //guint16                class_size;

        NULL,               //GBaseInitFunc          base_init;
        NULL,               //GBaseFinalizeFunc      base_finalize;

        /* classed types, instantiated types */
        (GClassInitFunc)my_class_init_func, //GClassInitFunc         class_init;
        NULL,               //GClassFinalizeFunc     class_finalize;
        NULL,               //gconstpointer          class_data;

        /* instantiated types */
        0,                  //guint16                instance_size;
        0,                  //guint16                n_preallocs;
        NULL,               //GInstanceInitFunc      instance_init;

        /* value handling */
        NULL,               //const GTypeValueTable *value_table;
    };

    GTypeFundamentalInfo my_fundamental_info = {
        G_TYPE_FLAG_CLASSED
    };

    GType my_type_id = g_type_register_fundamental(
            g_type_fundamental_next(),
            "MyClassedFundamentalType",
            &my_type_info,
            &my_fundamental_info,
            0
            );

    printf("%d\n",my_type_id);
    printf("%s\n",g_type_name(my_type_id));

    myclass_t *klass = (myclass_t*)g_type_class_ref(my_type_id);
    
    printf("foo: %d\n", klass->foo);
    printf("bar: %s\n", klass->bar);
    klass->baz();

    g_type_class_unref(klass);

    return 0;
}


Let's look at the my_type_info struct in the main function.  I filled the class_size field to be sizeof(myclass_t) so that the type-system can help me "malloc" my myclass_t struct.  I also filled the class_init function so that it will call my my_class_init_func to initialize it.

But I didn't fill the instance_size or instance_init so it is not instantiatable.  That is, this type has no instances.

Q: How can it be it useful to have such a type that has no instances?
A: Well... I admit it is not that useful.  It may work as something like a "singleton" (a globally unique object).  Interfaces (like they are in Java/C#) in GObject are also non-instantiatable types.

Then the my_fundamental_info struct following the my_type_info variable in the main function.  I marked this class as "classed".


Let's look at my myclass_t structure. 

Q: Why don't you follow the GObject naming convention and name it as MyClass?
A: It is intentional.  I am emphasizing that it is not the naming-convention, but the function calls (like g_type_register_fundamental) and its parameters (like GTypeInfo, GTypeFundamentalInfo and so on) that make GObject work.  Yeah, you should follow the convention in real-world programming.

typedef struct {
    GTypeClass something_as_boilerplate;
    int foo;  // Not a good idea to store data here.
    char* bar;
    void (*baz)();
} myclass_t;


The first member is a GTypeClass field.  It is required that in GObject type system, all class-structs should begin with a GTypeClass field.

Q: What's inside the GTypeClass?
A: The documentation does not tell me.  The source code is:
typedef struct _GTypeClass              GTypeClass;
struct _GTypeClass
{
  /*< private >*/
  GType g_type;
};


So every class struct starts with a GType field (GType is typedef'ed to be gsize which is then typedef'ed to be unsigned int).  This can be queryed at runtime to find the type-id (GType) of a type.

Then there are an int field "foo", a char pointer "bar" and a function pointer "baz" in myclass_t struct.  foo and bar are static members of my class.  baz, which you may think to be a static member, can also be a virtual method of a class (this will be discussed later).

Let's move on to the my_class_init_func which I filled into the class_init field of the "GTypeInfo my_type_info" struct.
void my_class_init_func(myclass_t* klass, gpointer data) {
    printf("my_class_init_func called!\n");
    klass->foo = 42;
    klass->bar = "Hello world!";
    klass->baz = baz_function;
}


It takes two parameters.  One of them is a myclass_t pointer pointing to the struct to be initialized.  I name it "klass" because "class" is a keyword in C++ and would not work with a C++ compiler.  The other is the class_data field provided in the GTypeInfo struct (where I set it to NULL).

I initialized the myclass_t struct here.  I filled the foo, bar and baz field.


Now the main function.  Here I register my type.  And then:
    myclass_t *klass = (myclass_t*)g_type_class_ref(my_type_id);
    
    printf("foo: %d\n", klass->foo);
    printf("bar: %s\n", klass->bar);
    klass->baz();

    g_type_class_unref(klass);

I call the g_type_class_ref function so that my class struct is initialized.  Then the members of klass are filled.  Finally I call the g_type_class_unref(klass) to unref this class (this may be not necessary here).


Note that it is not a good idea to store static data member into the class struct.  It is difficult to get a pointer to the class struct without having an instance of this class.  You may wish to access the class member in the main function or in a static function.  It is better to use global variables and use naming conventions to show that they belong to a class.

分享到:
评论

相关推荐

    Scratch 手速判断游戏:反弹之神.sb3

    游戏警报:潜入“反弹”,这是一种充满活力的街机体验,你的反应主宰了竞技场!受youtuber Dani 一天游戏挑战的启发,你就是一个肩负使命的球:发射、得分、生存! 为你的射击蓄力:按住鼠标等待射击时间。 瞄准并发射:释放以朝光标射击。距离等于速度和弹跳力! 得分:击球得分。 避开格林:他们是游戏终结者! 阻止红色和紫色:如果他们垫底,他们会伤害你的健康。紫色添加了随机反弹的狂野扭曲! SJA 分析数据: · 代码数量: 代码总数:4775 ,有效代码:4671 ,代码块:164 ; · 高级编辑: 扩展种类:2 ,函数定义:49 ,变量 & 列表定义:165 ; · 资源数量: 角色数:12 ,造型数量:444 ,音频数量:54 ; · 资源大小: 工程大小:19.1MB ,音频大小:15.4MB ,造型大小:1.7MB 。 此后仍有作品或有趣游戏,可以进行学习与借鉴。请关注作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送资源!快来评论吧!

    【课程设计】实现的金融风控贷款违约预测python源码.zip

    【课程设计】实现的金融风控贷款违约预测python源码.zip

    一个基于STM32F103单片机的无线测距系统.zip

    一个基于STM32F103单片机的无线测距系统.zip

    node-v0.10.9-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    PiP-Tool.msi

    PiP-Tool

    node-v0.10.10-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.10.30-sunos-x64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    JAVA网络通信系统的研究与开发(LW+源代码+开题报告).zip

    JAVA网络通信系统的研究与开发(LW+源代码+开题报告)JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).JAVA网络通信系统的研究与开发(LW+源代码+开题报告).

    Supervised_contrastive_loss_pytorch-main.zip

    Supervised_contrastive_loss_pytorch-main

    node-v4.1.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.12.14-darwin-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    nodejs-x64-0.11.4.tgz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    人工智能+深度学习+深度学习数学基础+整理完整版

    【项目资源】:汇聚了云计算、区块链、网络安全、前端设计、后端架构、UI/UX设计、游戏开发、移动应用开发、虚拟现实(VR)、增强现实(AR)、3D建模与渲染、云计算服务、网络安全工具等各类技术项目的素材和模板。包括AWS、Azure、Docker、Kubernetes、React、Vue、Angular、Node.js、Django、Flask、Unity、Unreal Engine、Blender、Sketch、Figma、Wireshark、Nmap等项目的素材和模板。【项目质量】:所有素材和模板都经过精心筛选和整理,确保满足专业标准。在发布前,我们已经对功能进行了全面测试,确保其稳定性和可用性。【适用人群】:适合对技术充满热情的初学者、希望提升专业技能的中级开发者、以及寻求创新解决方案的高级工程师。无论是个人项目、团队合作、课程设计还是商业应用,都能在这里找到合适的资源。【附加价值】:这些项目资源不仅具有很高的学习价值,而且能够直接应用于实际项目中,提高开发效率。对于有志于深入研究或拓展新领域的人来说,它们提供了丰富的灵感和基础框架,帮助你快速构建出令人惊艳的作品。

    node-v0.10.45-linux-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    第八节.py

    第八节.py

    node-v0.10.37-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    螺旋丸,svg,真的好像!!!

    svg,真的好像!!!

    node-v0.11.4-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    通用nvme模块.rar

    技嘉B85M-DS3H-REV:2.0版本-mmtool刷BIOS-nvme模块

Global site tag (gtag.js) - Google Analytics