1.main.c
#include <iostream>
#include <typeinfo>
using namespace std;
extern "C"
{
#include <glib.h>
#include <glib-unix.h>
#include <glib-object.h>
#include <stdio.h>
typedef struct MyDemoPrivate{
gchar *name;
gint64 age;
}MyDemoPrivate;
typedef struct _MyDemo {
GObject parent;
MyDemoPrivate *priv;
}MyDemo;
//類結構體
typedef struct _MyDemoClass {
GObjectClass parent_class;
}MyDemoClass;
}
//GType my_demo_get_type(void) G_GNUC_CONST;//my_demo_get_type將會使用宏G_DEFINE_TYPE去實現(G_DEFINE_TYPE(MyDemo,my_demo,G_TYPE_OBJECT)),其中的my通常表示命名空間,demo表示對象名字,get_type爲固定字段
//G_DEFINE_TYPE用法
G_DEFINE_TYPE (MyDemo, my_demo, G_TYPE_OBJECT);
/*
* G_DEFINE_TYPE 可以讓 GObject 庫的數據類型系統能夠識別我們所定義的 MyDemo 類類型,
* 它接受三個參數,第一個參數是類名,即 MyDemo;第二個參數則是類的成員函數名稱的前綴,例如 my_demo_get_type 函數即爲 MyDemo 類的一個成員函數,"my_demo"是它的前綴;第三個參數則指明 MyDemo 類類型的父類型爲G_TYPE_OBJECT。
* G_DEFINE_TYPE中會調用一個 g_type_register_static_simple 的函數,這個函數的作用就是將用戶自己定義的類型註冊到系統中,
* G_DEFINE_TYPE還定義了2個函數(my_demo_init 和 my_demo_class_init),需要自己實現這兩個函數。它們是對象的初始化函數,相當於c++的構造函數,第一個函數在每個對象創建的時候都會被調用,
* 第二個函數只有在第一次創建對象的時候被調用(比如在調用g_type_class_ref的時候,如果class沒有初始化,就會調用my_demo_class_init)
*/
//類結構體初始化函數:G_DEFINE_TYPEy定義的實現
static void my_demo_class_init(MyDemoClass *klass){
printf("xxx----------> %s(), line = %d\n",__FUNCTION__,__LINE__);
}
//實例結構體初始化函數:G_DEFINE_TYPEy定義的實現
static void my_demo_init(MyDemo *self){
printf("xxx----------> %s(), line = %d\n",__FUNCTION__,__LINE__);
}
int main(int argc, char* argv[])
{
int a;
float b;
double c;
char *d;
int type = 3;
#if !GLIB_CHECK_VERSION(2,32,0)
if (! g_thread_supported ())
g_thread_init (NULL);
#endif
#if !GLIB_CHECK_VERSION(2,36,0)
g_type_init ();
#endif
printf("xxx----------> %s(), line = %d, type = %d\n",__FUNCTION__,__LINE__,type);
//調用合成的my_demo_get_type()函數.
type = my_demo_get_type();
printf("xxx----------> %s(), line = %d, type = %d\n",__FUNCTION__,__LINE__,type);
printf("xxx----------> %s(), line = %d, get_type = %s\n",__FUNCTION__,__LINE__,typeid(type).name());
cout << "type = " << typeid(type).name() << endl;;
cout << "a = " << typeid(a).name() << endl;;
cout << "b = " << typeid(b).name() << endl;;
cout << "c = " << typeid(c).name() << endl;;
cout << "d = " << typeid(d).name() << endl;;
return 0;
}
2.Makefile
CC = g++
CC_FLAGS = $(shell pkg-config --cflags glib-2.0 gthread-2.0 gobject-2.0)
CC_FLAGS += -std=c99 -g
LD_FLAGS = $(shell pkg-config --libs glib-2.0 gthread-2.0 gobject-2.0)
gobjectdemo:main.o
$(CC) -o $@ $+ $(LD_FLAGS)
%.o:%.cpp
$(CC) $(CC_FLAGS) -c -o $@ $<
clean:
rm -rf *.o gobjectdemo
3.Readme
# sudo apt install libglib2.0-dev
# make
# ./gobjectdemo
https://developer.gnome.org/glib/2.36/