如何在通过该指针调用的函数中获取指针地址

时间:2019-04-16 20:03:41

标签: c pointers

我读了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;
}

2 个答案:

答案 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;
}