glib之gobject G_DEFINE_TYPE用法demo

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/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章