是否可以从glib中的类实例访问类方法?

时间:2019-02-28 12:35:08

标签: c glib gobject

尝试调用DogClass的“对话”功能时收到以下错误: “对话”不是_DogFile的成员。

事实上,我已经在_DogFileClass结构中声明了狗文件, 在class_init中,我指向了对话功能。 如何从类的实例访问类方法?

我要提供相关代码:

dog.h:

struct _DogFileClass
{
    GObjectClass parent_class;
    void (*talk)(DogFile *self)
}

void dog_file_talk(DogFile *self);

dog.c

void dog_file_real_talk(DogFile *self);

void dog_file_class_init(DogFileClass *klass)
{
    klass->talk = dog_file_real_talk;
}

void dog_file_talk(DogFile *self)
{
    g_return_if_false(DOG_IS_FILE);
    DogFileClass *klass = DOG_FILE_GET_CLASS(self);
    return klass->talk(self);
}

dog_file_real_talk(DogFile *self)
{
    printf("WOOF")
}

最后,我想通过以下方式使用对话功能: dog->talk(dog); 当dog是指向DogFile类的指针

1 个答案:

答案 0 :(得分:1)

  

最后,我想通过以下方式使用对话功能:dog-> talk(dog);当dog是指向DogFile类的指针

这是不可能的,因为talk不是DogFile结构的成员。您在dog_file_talk()中的代码看起来正确,因此,不要尝试使用dog->talk (dog),而要使用dog_file_talk (dog)

恐怕这是使用GObject在C语言中最接近OOP的地方。如果您要在talk结构上拥有一个DogFile成员,则该指针将为DogFile的每个实例重复,这将防止它被子类覆盖,并且成为一个浪费内存。

如果您想要更多的“自然” OOP,请直接使用C ++(或更现代的语言,如Rust)。