如何让C语言结构体的成员函数识别调用它的结构体实例?
问题解决:让C结构体的函数指针修改调用实例的成员
你需要在C语言里实现类似面向对象中成员函数的效果,让SetActive能自动识别调用它的结构体实例并修改其_active成员。原代码的核心问题是函数指针没有传递实例指针,导致函数无法区分调用者。下面是具体实现方案:
关键修改点
- 调整函数指针签名,新增
Object*类型参数用来传递当前调用的结构体实例(类似C++的this指针) - 修改
SetActive函数实现,通过传入的实例指针访问并修改_active成员 - 初始化每个结构体实例时,将函数指针指向实现好的
SetActive函数
完整代码示例
#include <stdbool.h> typedef struct Object Object; // 提前声明,让函数指针能识别Object类型 typedef struct Object { bool _active; void (*SetActive)(Object*, bool); // 新增Object*参数传递实例指针 } Object; // 实现SetActive函数,第一个参数为当前实例的指针 void SetActive(Object* self, bool set) { self->_active = set; // 通过self指针修改对应实例的_active成员 } int main() { Object someObject; Object someOtherObject; // 初始化每个实例的函数指针 someObject.SetActive = SetActive; someOtherObject.SetActive = SetActive; // 调用时传入当前实例的指针作为第一个参数 someObject.SetActive(&someObject, true); someOtherObject.SetActive(&someOtherObject, false); // 验证结果:someObject._active为true,someOtherObject._active为false return 0; }
优化:用宏简化调用
如果觉得每次传&实例名繁琐,可以定义宏模拟面向对象调用语法:
#define CALL_METHOD(obj, method, ...) (obj)->method((obj), ##__VA_ARGS__) // 调用示例 CALL_METHOD(&someObject, SetActive, true);
内容的提问来源于stack exchange,提问作者DominicusPurple
相关产品推荐
相关产品推荐

