Реализация интерфейса GObject в C ++ - PullRequest
6 голосов
/ 13 февраля 2011

Я пытаюсь реализовать интерфейс GType в C ++, используя Glibmm (часть Gtkmm).Объект будет передан API в C. К сожалению, документация для 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 будет ложным после выполнения этого кода, и в командной строке появится следующее сообщение:

(monagui: 24831): GtkSourceView-CRITICAL **: gtk_source_completion_add_provider: утверждение `GTK_IS_SOURCE_COMPLETION_PROVIDER (provider) 'не удалось

Кажется, что базовый gobj() не знает, что предполагается реализовать этот интерфейс.Если класс не является производным от Glib::Object, gobj() даже возвращает ноль.Я надеюсь, что мне не нужно писать GObject, реализующий этот интерфейс на C вручную.

Итак, как правильно это сделать?Заранее спасибо.

PS: Для тех, кому интересно: SourceCompletionProvider

1 Ответ

5 голосов
/ 04 марта 2011

Наконец, я нашел решение.

Определение класса (порядок подклассов имеет значение):

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

Конструктор (снова, порядок имеет значение):

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

Решение найдено путем проверки того, как это было сделано в Гикачу .

...