c - 是否可以从 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类的指针时
解决方案
最后我想使用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)。
推荐阅读
- c++ - 分段错误,由错误的区间(二维数组)引起
- opengl - 渲染草书字体
- sql-server - SQL Server 没有 BEFORE INSERT 触发器吗?
- shell - 读取 Expect 脚本中的变量行
- python - Django sentry - request.sentry 对象
- c# - 加载程序集时出现异常:System.IO.FileNotFoundException:无法加载程序集“Windows.Foundation.FoundationContract”
- python - 将 Python 列表转换为多列 Pandas 数据框
- c# - Windows 10 更新后 ClickOnce 安装问题
- microsoft-cognitive - 使用 API v4.0 训练 QnA Maker
- javascript - 使用 JQuery 提交两次表单