如何定義和實現新的GObject之物件構造和析構

2021-07-31 23:50:52 字數 2092 閱讀 1470

1、物件構造

在嘗試構建自己的gobjects時人們常常會感到困惑,因為它們有很多不同的方法來實現物件的構造過程:很難確定哪個是正確的方法。

表4中,「g_object_new」顯示了在物件例項化過程中呼叫的使用者提供的函式以及它們被呼叫的順序。instance_init函式相當於c++中的建構函式。在所有父節點的instance_init函式都被呼叫後子類的instance_init都將被呼叫。它不能隨意的傳遞構造引數(如c ++中),但是如果您的物件需要任意引數來完成初始化,則可以使用構造屬性。

只有在所有的instance_init函式都執行之後,才能設定構造屬性。在所有構造屬性設定完成之前,不會將物件引用返回給g_object_new的客戶端。

重要的是要注意物件構造不能失敗。如果您需要乙個可能會失敗的gobject構造,則可以使用gio庫提供的ginitable和gasyncinitable介面。

首先應當實現如下**:

g_define_type_with_private (viewerfile, viewer_file, g_type_object)

static void

viewer_file_class_init (viewerfileclass *klass)

static void

viewer_file_init (viewerfile *self)

如果需要特殊的構造屬性(使用g_param_construct_only設定),請在class_init()函式中安裝屬性函式覆蓋gobject類的set_property()和get_property()方法,並按照「物件屬性」一節所述實現它們。

屬性id必須從1開始,因為0被保留供gobject內部使用。

enum

;static gparamspec *obj_properties[n_properties] = ;

static void

viewer_file_class_init (viewerfileclass *klass)

如果需要,請確保您可以構建和執行與上述**相似的**。 此外,確保您的構造屬性可以在構造期間被設定且沒有其他不好的影響。

有些人有時需要在傳遞給建構函式的屬性設定完成之後才能完成型別例項的初始化。 這可以通過使用在物件例項化」的部分中描述的constructor()類方法,或者更簡單地說,使用compiled()類方法。 請注意,僅在屬性標記為g_param_construct_only或g_param_construct時

才會呼叫compiled()虛函式,且呼叫發生在傳遞給g_object_new()的常規屬性設定之前。

2、物件析構

同樣,通常很難弄清楚使用哪種機制來實現物件的銷毀過程:當最後一次g_object_unref函式呼叫時,會發生許多事情,如表5「g_object_unref」所述。

您的物件的銷毀過程分為兩個階段:dispose和finalize。由於gobject使用的參考計數機制的性質以及銷毀序列中的訊號發射情況下的臨時復現情況,這種分成兩個階段的方法是處理潛在週期的必要條件。有關詳細資訊,請參閱「引用計數和迴圈」一節。

struct _viewerfileprivate

;g_define_type_with_private (viewerfile, viewer_file, g_type_object)

static void

viewer_file_dispose (gobject *gobject)

static void

viewer_file_finalize (gobject *gobject)

static void

viewer_file_class_init (viewerfileclass *klass)

static void

viewer_file_init (viewerfile *self);

dispose執行之後finalize執行之前,可能會呼叫物件方法。 gobject不認為這是乙個程式錯誤:您必須能夠正常檢測到這一點,既不會崩潰也不會警告使用者,通過使乙個被

dispose的例項恢復到惰性狀態。

堆疊的定義和實現

實現 資料結構 stack 陣列實現 功能 push 進棧 void push const type val pop 出棧 void pop top 返回棧頂元素 const reference top const size 返回棧大小 size type size const empty 判斷棧是...

類的定義和實現

1.類的定義 在類的定義中,關鍵字為 inte ce 關鍵字後面為類名,類名一般情況下首字母大寫 冒號後面 nsobject 是父類 命名時要見名知意 大駝峰命名 命名時每個單詞的首字母大寫 一般用於類的命名 小駝峰命名 第乙個單詞首字母小寫,以後每個單詞的首字母大寫,一般用於例項變數和引數的命名 ...

定義和實現分離

定義和實現分離,oop的程式設計,或則.我也不知道,這邊文章改定義什麼樣的標題好呢,然後.我們來看一段 的優化,來逐步的體會一下 public enum scheduletype 這種方式,我們可以使用多種方式來進行優化滴呀 簡單的swich case 方式滴啊 然後就是我們的 委託的方式滴呀 還有...