无法理解奇怪的C运行时错误。需要帮忙?

时间:2011-09-23 10:09:30

标签: c oop gtk gobject

我正在尝试掌握GObject库。所以我尝试通过继承GtkHBox来制作一个简单的Gtk + Custom Widget。我无法弄清问题是什么,甚至问题出在哪里,所以我必须粘贴整个代码。这是代码:

  

notetab.h

#ifndef NOTETAB_H
#define NOTETAB_H

G_BEGIN_DECLS

#define PRO_NOTE_TAB(obj) GTK_CHECK_CAST(obj, pro_note_tab_get_type (), ProNoteTab)
#define GTK_CPU_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, pro_note_tab_get_type(), ProNoteTabClass)
#define GTK_IS_CPU(obj) GTK_CHECK_TYPE(obj, pro_note_tab_get_type())

typedef struct _ProNoteTab ProNoteTab;
typedef struct _ProNoteTabClass ProNoteTabClass;

struct _ProNoteTab
{
    GtkWidget hbox;
    GtkObject parent_instance;
    GtkLabel label;
    GtkButton cbtn;
};

struct _ProNoteTabClass
{
    GtkHBoxClass parent_class;
};

GtkType pro_note_tab_get_type(void);
GtkWidget* pro_note_tab_new(void);

G_END_DECLS

#endif
  

notetab.c

#include "common.h"
#include "notetab.h"

GtkType pro_note_tab_get_type()
{
    GtkType pro_note_tab_type = 0;

    if (!pro_note_tab_get_type)
    {
        static const GtkTypeInfo pro_note_tab_info =
        {
            "ProNoteTab",
            sizeof(ProNoteTab),
            sizeof(ProNoteTabClass),
            (GtkClassInitFunc) NULL,
            (GtkObjectInitFunc) NULL,
            NULL,
            NULL,
            (GtkClassInitFunc) NULL
        };

        pro_note_tab_type = gtk_type_unique(GTK_TYPE_WIDGET, &pro_note_tab_info);
    }

    return pro_note_tab_type;
}

GtkWidget* pro_note_tab_new(void)
{
    return GTK_WIDGET(gtk_type_new(pro_note_tab_get_type()));
}

现在程序编译得非常好。但是我在运行时得到的错误是:

  
    

GTK_CRITICAL **:IA__gtk_type_new:断言GTK_TYPE_IS_OBJECT(type) failed     GTK_CRITICAL **:IA__gtk_container_add:断言GTK_IS_WIDGET(widget) failed

  

我做错了什么?或者甚至我这个错误在世界上是什么?

3 个答案:

答案 0 :(得分:1)

根据文档,gtk_type_unique“已弃用,不应在新编写的代码中使用”。

请改用g_type_register_static。更重要的是,如果你想要掌握GObject,而不是老Gtk +。

无论如何,我要说你的错误是由于你设置的一些NULL函数指针造成的,有些可能不是可选的,但这个文档很难记录。

答案 1 :(得分:0)

首先,pro_note_tab_type 中的pro_note_tab_get_type()变量确实看起来应该是static

答案 2 :(得分:0)

那一定是问题

 if (!pro_note_tab_get_type)
{