作为另一个学习C的Javascript开发人员,我试图实现一个基本对象。
#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 */
#include "./UserStruct.h"
int getAge(User this) {
return this.age;
}
User initUser(int age){
User user;
user.age = age;
user.getAge = getAge;
return user;
}
#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)
答案 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