首页 > 解决方案 > 是否可以从 glib 中的类实例访问类方法?

问题描述

尝试调用我的 DogClass 的“谈话”函数时收到以下错误:“谈话”不是 _DogFile 的成员。

事实上,我已经在 _DogFileClass 结构体中声明了狗文件,并且在 class_init 中我指向了talk函数。如何从类的实例访问类方法?

我包括相关代码:

狗.h:

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

void dog_file_talk(DogFile *self);

狗.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")
}

最后我想使用talk函数,方式如下: dog->talk(dog); 当dog是指向DogFile类的指针时

标签: cglibgobject

解决方案


最后我想使用talk函数,方式如下: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)。


推荐阅读