如何使指针在新结构中兼容?

时间:2019-04-30 07:48:50

标签: c struct gtk typedef

我正在尝试“继承” GtkWidget。我可以继承其他任何控件,例如GtkWindow等,并在自己的文件中实现其方法。然后,我将使用一个函数返回新的窗口小部件,该函数将返回return g_object_new(...这样的窗口小部件。

代码工作正常,但在结构初始化函数中收到 不兼容的指针类型 警告。

  

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);
}

在函数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 个答案:

答案 0 :(得分:2)

通常,您应该使用强制转换运算符来避免编译器警告,假设self是一个指针:

gtk_widget_set_name((GtkWidget*)self, "Widget");

答案 1 :(得分:1)

定义对象也是如此,GTK_WIDGET(obj)

代替

gtk_widget_set_name(self, "Widget"); 

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

如果self是窗口GTK_WINDOW(self)

,则始终可以定义对象