コンテンツにスキップ

GObject

出典: フリー教科書『ウィキブックス(Wikibooks)』

GObjectは、C言語向けのオブジェクト指向フレームワークであり、GNOMEプロジェクトやGTKの基盤となっています。このハンドブックでは、GObjectの基本概念、クラスやインターフェースの作成、シグナルの利用方法、メモリ管理などを解説します。

対象読者

[編集]
  • C言語の基礎知識を持つプログラマー
  • GObjectを使ったアプリケーション開発に興味がある方

前提条件

[編集]
  • 基本的なC言語の知識
  • GLibのインストール済み環境
  • GCCやClangなどのCコンパイラ

目次

[編集]
  1. GObjectとは
  2. GObjectの基本
  3. クラスとプロパティの作成
  4. シグナルの利用
  5. メモリ管理
  6. 演習問題

GObjectとは

[編集]

GObjectは、C言語にオブジェクト指向の機能を追加するためのライブラリです。主な特徴は以下の通りです:

  • クラスと継承: オブジェクト指向プログラミングの基本概念をサポート
  • シグナル: オブジェクト間のイベント通知を実現
  • プロパティ: オブジェクトの属性を動的に操作可能

GObjectの基本

[編集]

GObjectの初期化

[編集]

GObjectを使用するには、GLibの初期化が必要です。以下に最小限のコード例を示します:

#include <glib-object.h>

int main() {
    g_type_init(); // GLibの初期化(GObject 2.36以降では不要)
    return 0;
}

GTypeとは

[編集]

GTypeは、GObjectがオブジェクトタイプを管理するための仕組みです。GTypeにより、クラス情報や継承関係が管理されます。

クラスとプロパティの作成

[編集]

GObjectを使って独自のクラスを作成する例を以下に示します。

クラス定義

[編集]
#include <glib-object.h>

/* MyObjectクラスの宣言 */
G_DECLARE_FINAL_TYPE(MyObject, my_object, MY, OBJECT, GObject)

struct _MyObject {
    GObject parent_instance;
    int my_property; // プロパティ
};

/* クラスの実装 */
G_DEFINE_TYPE(MyObject, my_object, G_TYPE_OBJECT)

static void my_object_class_init(MyObjectClass *klass) {
    /* クラス初期化処理 */
}

static void my_object_init(MyObject *self) {
    self->my_property = 0;
}

シグナルの利用

[編集]

GObjectでは、シグナルを用いてオブジェクト間の通信を実現します。

シグナルの登録と発行

[編集]
#include <glib-object.h>

/* シグナルの定義 */
enum {
    SIGNAL_MY_SIGNAL,
    N_SIGNALS
};

static guint my_signals[N_SIGNALS];

G_DEFINE_TYPE(MyObject, my_object, G_TYPE_OBJECT)

static void my_object_class_init(MyObjectClass *klass) {
    my_signals[SIGNAL_MY_SIGNAL] = g_signal_new(
        "my-signal",
        G_TYPE_FROM_CLASS(klass),
        G_SIGNAL_RUN_LAST,
        0,
        NULL, NULL, NULL,
        G_TYPE_NONE, 0
    );
}

メモリ管理

[編集]

GObjectは参照カウント方式でメモリ管理を行います。`g_object_ref()`および`g_object_unref()`で管理します。

演習問題

[編集]

問題1: 基本クラスの作成

[編集]

独自のクラスを作成し、プロパティを1つ追加してください。

問題2: シグナルの利用

[編集]

クラスにシグナルを追加し、シグナルを発行してハンドラを呼び出してください。

参考文献

[編集]