6

Glibmm(Gtkmmの一部)を使用してC++でGTypeインターフェースを実装しようとしています。オブジェクトはCのAPIに渡されます。残念ながら、gtkmmのドキュメントには、GObjectシステムをラップする方法の詳細が多く含まれていません。

私がこれまでに持っているもの:

class MonaCompletionProvider : public gtksourceview::SourceCompletionProvider, public Glib::Object
{
    public:
        MonaCompletionProvider();
        virtual ~MonaCompletionProvider();

        Glib::ustring get_name_vfunc() const;
        // ... and some more
}

すべてのメソッドとコンストラクターの実装は空です。コードは次のように使用されます。

Glib::RefPtr<MonaCompletionProvider> provider(new MonaCompletionProvider());
bool success = completion->add_provider(provider);

successこのコードを実行するとfalseになり、コマンドラインに次のメッセージが表示されます。

(monagui:24831):GtkSourceView-CRITICAL **:gtk_source_completion_add_provider:アサーション `GTK_IS_SOURCE_COMPLETION_PROVIDER(プロバイダー)'が失敗しました

原資産gobj()は、このインターフェースを実装することになっていることを認識していないようです。クラスがから派生していない場合でもGlib::Objectgobj()nullを返します。このインターフェイスをCで実装するGObjectを手動で作成する必要がないことを願っています。

では、これを行う正しい方法は何ですか?前もって感謝します。

PS:興味のある方へ:SourceCompletionProvider

4

1 に答える 1

5

最後に、私は解決策を見つけました。

クラス定義(サブクラスの順序が重要):

class MonaCompletionProvider : public Glib::Object, public gtksourceview::SourceCompletionProvider {
...

コンストラクター(ここでも、順序が重要です):

MonaCompletionProvider::MonaCompletionProvider() :
    Glib::ObjectBase(typeid(MonaCompletionProvider)),
    Glib::Object(),
    gtksourceview::SourceCompletionProvider() {
...

それがGuikachuでどのように行われたかを調べることによって見つけられた解決策。

于 2011-03-04T15:04:30.233 に答える