尝试调用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类的指针
答案 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)。