简体   繁体   English

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

[英]How do I make pointers compatible in a new struct?

I am trying 'inherit' a GtkWidget. 我正在尝试'继承'一个GtkWidget。 I could inherit any other widget like GtkWindow etc and implement its methods in its own file. 我可以继承任何其他小部件,如GtkWindow等,并在自己的文件中实现其方法。 I am then going to load the new widget with a function which returns the widget like so return g_object_new(... . 然后我将使用一个函数加载新的小部件,该函数返回小部件,如此return g_object_new(...

The code works fine but I get incompatible pointer type warning in the struct init function. 代码工作正常,但我在struct init函数中得到不兼容的指针类型警告。

class.h 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 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 the function static void class_name_init(ClassName *self) , I want to use the pointer self like so 在函数static void class_name_init(ClassName *self) ,我想像这样使用指针self

gtk_widget_set_name(self, "Widget");

This is where I have compatible pointer type. 这是我有兼容的指针类型的地方。 gtk_widget_set_name() is expecting a type GtkWidget as an input but the init function has the type ClassName . gtk_widget_set_name()期望类型为GtkWidget作为输入,但init函数的类型为ClassName

Gtk knows ClassName is the same type as GtkWidget hence the code works but is there anyway to fix the code so that the compiler doesn't think its a mistake Gtk知道ClassName与GtkWidget是相同的类型,因此代码可以工作,但无论如何都要修复代码,以便编译器不认为它是一个错误

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

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

Defining the object also works like so GTK_WIDGET(obj) 定义对象也像GTK_WIDGET(obj)

Instead of 代替

gtk_widget_set_name(self, "Widget"); 

do

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

You can always define the object if self is a window GTK_WINDOW(self) 如果self是一个窗口,你可以随时定义对象GTK_WINDOW(self)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM