Как сделать указатели совместимыми в новой структуре? - PullRequest
3 голосов
/ 30 апреля 2019

Я пытаюсь «унаследовать» GtkWidget.Я мог унаследовать любой другой виджет, такой как GtkWindow и т. Д., И реализовать его методы в своем собственном файле.Затем я собираюсь загрузить новый виджет с функцией, которая возвращает виджет примерно так: return g_object_new(....

Код работает нормально, но я получаю несовместимый тип указателя предупреждение в функции struct init.

class.h

#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED

#include <gtk/gtk.h>
#define CLASS_NAME_TYPE (class_name_get_type())
G_DECLARE_FINAL_TYPE(ClassName, class_name, CLASS, NAME, GtkWidget)

ClassName *class_name_new();

#endif // CLASS_H_INCLUDED

class.c

#include "class.h"

struct _ClassName
{
  GtkWidget parent;
};

G_DEFINE_TYPE(ClassName, class_name, GTK_TYPE_WIDGET);

static void class_name_init(ClassName *self)
{
    gtk_widget_set_name(self, "Widget");
}

static void class_name_class_init(ClassNameClass *klass)
{

}

ClassName *class_name_new()
{
    return g_object_new(CLASS_NAME_TYPE, /* "foo", bar ,*/ NULL);
}

Inфункция static void class_name_init(ClassName *self), я хочу использовать указатель self примерно так

gtk_widget_set_name(self, "Widget");

Здесь у меня есть совместимый тип указателя.gtk_widget_set_name () ожидает тип GtkWidget в качестве входа, но функция init имеет тип ClassName .

Gtk знает, что ClassName - это тот же тип, что и GtkWidget, поэтому кодработает, но в любом случае можно исправить код, чтобы компилятор не считал его ошибкой

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

В общем, вы должны использовать оператор приведения, чтобы избежать предупреждений компилятора, предполагая, что self является указателем:

gtk_widget_set_name((GtkWidget*)self, "Widget");
1 голос
/ 30 апреля 2019

Определение объекта также работает следующим образом: GTK_WIDGET(obj)

Вместо

gtk_widget_set_name(self, "Widget"); 

do

gtk_widget_set_name(GTK_WIDGET(self), "Widget");`

Вы всегда можете определить объект, если self являетсяокно GTK_WINDOW(self)

...