我读了this article,但没有回答我的问题。
文件:hero.h
typedef struct {
int id;
void (*setId)();
int (*getId)();
} Hero, *HeroPtr;
文件:hero.c
#include "hero.h"
static void setId(int id);
Hero obj = {
.setId = setId,
.getId = getId,
};
void setId(int id) {
HeroPtr hero_obj = 0x0; //TODO how get address: hero_obj1 (1 > ) OR
// hero_obj2 (2 > )
hero_obj->id = id;
}
void getId() {
HeroPtr hero_obj = 0x0; //TODO how get address: hero_obj1 (1 > ) OR
// hero_obj2 (2 > )
return hero_obj->id;
}
文件:main.c
#include "hero.h"
int main() {
Hero hero_obj1, hero_obj2;
//1 >
hero_obj1->setId(1);
//2 >
hero_obj2->setId(2);
return 0;
}
答案 0 :(得分:0)
您似乎正在尝试通过使用函数指针在C中实现虚函数。在诸如C ++或Java的面向对象的编程语言中,类中的此类函数或方法将隐式this
指针作为参数,而该指针是隐藏的。这意味着int getId()
函数实际上具有签名int getId(Hero* this)
,而void setId(int id)
函数实际上具有形式void setId(Hero* this, int id)
。正如我已经说过的那样,在面向对象的编程语言中,您不会看到或添加this
指针,并且在调用函数时也不会传递参数。编译器为您执行此操作。它总是自动将指针作为this
指针传递给实例,在该实例上调用了函数。但是,在C语言中,这些功能不存在。因此,您必须添加this
参数并在自己调用该函数时将其传递。
答案 1 :(得分:0)
您可以做等同于C ++在幕后所做的事情。
文件:hero.h
typedef struct hero {
int id;
void (*setId)(struct hero*, int);
int (*getId)(struct hero*);
} Hero, *HeroPtr;
void constructHero(HeroPtr this);
文件:hero.c
#include "hero.h"
static void setId(HeroPtr this, int id);
static int getId(HeroPtr this);
Hero initObj = {
.setId = &setId,
.getId = &getId,
};
void constructHero(HeroPtr this)
{
*this = initObj;
}
void setId(HeroPtr this, int id) {
HeroPtr hero_obj = this;
hero_obj->id = id;
}
int getId(HeroPtr this) {
HeroPtr hero_obj = this;
return hero_obj->id;
}
文件:main.c
#include "hero.h"
#include "stdio.h"
int main() {
Hero hero1;
Hero hero2;
HeroPtr hero_obj1=&hero1;
HeroPtr hero_obj2=&hero2;
constructHero(hero_obj1);
constructHero(hero_obj2);
hero_obj1->setId(hero_obj1, 1);
hero_obj2->setId(hero_obj2, 2);
printf("hero_obj1 id = %d\n", hero_obj1->getId(hero_obj1));
printf("hero_obj2 id = %d\n", hero_obj2->getId(hero_obj2));
return 0;
}