GObject
GObjectは、C言語向けのオブジェクト指向フレームワークであり、GNOMEプロジェクトやGTKの基盤となっています。このハンドブックでは、GObjectの基本概念、クラスやインターフェースの作成、シグナルの利用方法、メモリ管理などを解説します。
対象読者
編集- C言語の基礎知識を持つプログラマー
- GObjectを使ったアプリケーション開発に興味がある方
前提条件
編集- 基本的なC言語の知識
- GLibのインストール済み環境
- GCCやClangなどのCコンパイラ
目次
編集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: シグナルの利用
編集クラスにシグナルを追加し、シグナルを発行してハンドラを呼び出してください。