作为结构的成员的功能

时间:2017-07-28 08:54:33

标签: c struct

作为另一个学习C的Javascript开发人员,我试图实现一个基本对象。

UserStruct.h

#ifndef USERSTRUCT_H
#define USERSTRUCT_H

struct User {
    int age;
    int (* getAge)();
};
typedef struct User User;

int getAge(User);
User initUser(int);
#endif /* USERSTRUCT_H */

UserStruct.c

#include "./UserStruct.h"
int getAge(User this) {
  return this.age;
} 

User initUser(int age){  
  User user;
  user.age = age;
  user.getAge = getAge;
  return user;
}

的main.c

#include <stdio.h>
#include <stdlib.h>
#include "./UserStruct.h"
int main(int argc, char** argv) {
   User user = initUser(15); // sets age to 15..
   user.age = 2222;
   printf("%d\n",user.getAge(1234)); // note the int passing here..
   printf("%d\n",user.age);
  return (EXIT_SUCCESS);
}

问题!:
  1.有人可以解释UserStruct定义中的语法int (* getAge)();吗?   2. getAge希望将User传递给它,它是如何传递int的?这一点特别奇怪,因为getAge的实现使用return this.age

虽然我确实弄明白了如何修复它,但我仍然不确定为什么这样做会像它那样。 (解决方案是将User的指针传递给getAge)

2 个答案:

答案 0 :(得分:3)

C不是面向对象的语言,因为它存在于对象之前,但是您的示例证明它可以与对象一起使用。

  • int (* getAge)()是一个函数指针,该函数接受任何参数()并返回int,以指定函数不带参数应定义(void)

  • getAge是类用户的“方法”,它需要一个对象实例,在对象语言中,语法将user.getAge()隐式传递this作为第一个参数,在C中它是显式的: getAge(user)

问题是int可以用作指针,这意味着user.getAge(1234)将使用1234作为用户的地址,因此将第二个int字段作为地址来实现getAge并跳转到这个地址。

答案 1 :(得分:2)

我已经以更好的方式修改了代码。

结构valor.toString("N", nfiNew); 的{​​{1}}字段是指向函数的指针。我已经修改了它的原型以获得它指向一个函数,该函数接收一个指向结构的指针,从中获取getAge字段内容。 (我使用指向结构的指针以避免通过堆栈传输整个结构)

User