【问题标题】:Is it possible to access class methods from class instance in glib?是否可以从 glib 中的类实例访问类方法?
【发布时间】:2019-02-28 12:35:08
【问题描述】:

我在尝试调用我的 DogClass 的“talk”函数时收到以下错误: 'talk' 不是 _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")
}

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

【问题讨论】:

  • 你为什么用.cpp后缀写c代码?!它将通过 C++ 编译器
  • 我的错,不小心写了cpp

标签: c glib gobject


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2014-01-26
    • 2019-09-20
    • 2015-07-09
    • 2017-05-12
    • 1970-01-01
    • 2014-01-26
    • 2022-08-10
    相关资源
    最近更新 更多