c语言结构体的程序例子(c语言结构体的向量操作)

本文主要介绍c语言结构的程序实例(c语言结构的向量运算),下面一起看看c语言结构的程序实例(c语言结构的向量运算)相关资讯。
例1:验证器例1来自百度文库c语言实现面向对象编程,现在这篇文章为他提供了免费学习版。
validator.h#ifndef玉子_ learn _ c _ validator _ h #定义玉子_ learn _ c _ validator _ h #包含stdbool.htypedef结构validator _ t { bool(* const validate)(结构validator_t *this,int value);}验证器;typedef结构{验证程序代理;int minint max} rangevalidatortypedef结构{验证程序代理;bool iseven//} oddevenvalidator;bool isinrange(validator* this,int value);//范围检查函数bool isevenorelsodd(validator * this,int value);//奇偶函数# define newrangevalidator (min,max) {{isinrange}、(min)、(max)} # define newodddevenvalider(iseven){ { isevenorelsodd }、(iseven)} # endif//玉子_学习_ c _ validator don t写成validator* proxy(加星号表示指针),否则会让宏定义更复杂!我们 我会在《动物与健康》中谈到它。;后面举个例子。
如果你不 不懂struct的语法,可以去c语言结构里找详细解释。如果你不 如果你不理解typedef struct的语法,你可以去c语言中寻找关于typ:(y))i = max ( j k,m-n);我= (( j k ) ( m-n)?(约翰·克·:);# define is _ even(n)((n)% 2 = = 0)if(is _ even(i))i;if((i)% 2 = = 0))i;解析# define xxx(arg 0){ func 0,(arg0)}语法的预处理器将替换宏定义的参数 照原样 。所以我们需要注意的是{},以及它所代表的struct结构变量的整个赋值的语法:
# include stdio . htypedef struct { int age;void (*游);}动物;虚空修行;//声明一个表示游泳练习的函数int main{//定义结构变量a,整体赋值。动物a = {11,练习};printf( % d \ n a .年龄);a . swim;返回0;} void practice{ printf( 练习游泳。\ n );}你可以尝试把结构animal的整个赋值部分写成一个宏定义,如下表所示:
带参数的宏定义被宏的代码预处理器替换后,#定义新动物(年龄){(年龄),练习}动物a =新动物(i);动物a = {( i),练习};因此,上面的代码可以重写为:
# include stdio . htypedef struct { int age;void (*游);}动物;虚空修行;//声明一个函数# define new animal (age) {(age),practice } int main{ animal a = new animal(11);printf( % d \ n a .年龄);a . swim;返回0;} void practice{ printf( 练习游泳。\ n );}解析# definenewxxx (arg0) (xxx) {func0,(arg0)}语法接下来,从某种意义上来说,我自己把问题复杂化了,但是让我提醒你:
animal * pa = new animal(11);//我误加了星号,导致了下面的讨论。编译时出现错误,我截获了关键的错误消息:
/home/geekziyu/clion projects/玉子-learn-jvm-c/learn nc/main.c:11:25: warning:初始化&; animal * &; { aka &; struct anonymous * &; } from &; int使指针从整数不经过强制转换[-wint-conversion]11 | # define new animal(age){(age),practice}.../home/geekziyu/clion projects/玉子-learn-jvm-c/learn nc/main.c:11:32: warning:标量初始值设定项中的多余元素11 | #define newanimal(age) {(age),practice}第一个错误没有找到有用的解决方法,但找到了第二个错误: overflow . com/questions/50614424/excess elements-in-scalar-initializer-for-struct。
因此,代码被修改为:
#包含 验证器# include stdio . htypedef struct { int age;void (*游);}动物;虚空修行;//声明一个函数# define new animal(age)(animal){(age),practice } int main{//注意这里pa是指针,不是结构变量animal * pa = new animal(11);printf( % d \ n pa-age);pa-游泳;返回0;} void practice{ printf( 练习游泳。\ n );由宏定义的预处理和替换结果如下表所示:
带参数的宏定义被宏代码预处理程序替换后,#定义新动物(年龄)(动物){(年龄),练习}动物* a =新动物(i);animal* a = (animal){( i),练习};# include 验证器bool isinrange(validator* this,int value){ range validator * validator =(range validator *)this;返回(*验证器)。最小值验证器-最大值;} bool isevenorelsodd(validator * this,int value){ oddevenvalidator * validator =(oddevenvalidator *)this;if (validator-iseven) {// even返回值% 2 = = 0;} else {返回值% 2 = = 1;} } main.c # include 验证器# includ测试范围验证器range validator = new range validator(1,10);validator * range proxy = range validator . proxy;int inputvalprintf( 请输入整数: );scanf( % d ,input val);printf( \ n );if(rang测试奇偶校验器odddevenvalidator even validator = newodddevenvalidator(true);validator * even proxy = even validator . proxy;printf( \ n请输入整数: );scanf( % d ,input val);printf( \ n );if(even proxy-validate(even proxy,input val)){ printf( 整数%d是一个偶数。 ,input val);} else { printf( 整数%d不是偶数。 ,input val);}返回0;}在这个例子中,c节中没有class关键字(那是c中才有的),所以用结构和它的关键字struct来表示 阶级和阶级c语言没有构造函数,带参数的宏(如# define xxx(arg 0,arg1) {(arg0),(arg1)}}行为像 类和类的构造函数。c语言中没有类的继承。通过使用在结构中嵌套其他结构的方法,我们可以实现 组合 其效果类似于 继承与发展。(如typedef struct { validator proxy...} rangevalidatorc语言没有多态性,而 多态性与可以通过使用函数指针(指向函数的指针)作为结构的组件并传入不同的函数来实现;(比如typedef struct { void(* swim);}动物;)例2:2:狗如何继承动物,参考电子发烧友c语言进行面向对象编程?,为您提供更友好的版本。
动物的父母类动物。:
# ifndefziyu _ learn _ jvm _ c _ animal _ h # defineziyu _ learn _ jvm _ c _ animal _ h//定义父类结构typedef struct {int ag:玉子_学习_ jvm _ c _动物_动物. c
#包含 动物 void animal_init(animal *this,int age,int weight){ this-age = age;this-weight =重量;} int animal _ get age(animal * this){ return this-age;} int animal _ getweight(animal * this){ return this-weight;在animal.h中声明和未定义的方法在animal.c中实现对比c:在c的方法中,第一个参数隐含了这个指针。当调用一个对象的方法时,编译器会自动将该对象的地址传递给这个指针。所以在animal.h中,我们会模拟函数,函数中显示了这个指针的定义,调用时主动把对象的地址传递给它,这样函数就可以处理任何动物对象。
子类dogdog.h
# ifndefziyu _ learn _ jvm _ c _ dog _ h # defineziyu _ learn _ jvm _ c _ dog _ h # include 动物 //定义子类结构typedef struct { animal parent//将父类结构int legs放在第一个位置;//添加子类 s自身属性}狗;//子类构造函数声明void dog _ init (dog * this,int age,int weight,int legs);//子类属性声明int dog _ get age(dog * this);int dog _ getweight(dog * this);int dog _ get legs(dog * this);# endif//玉子_学习_jvm_c_dog_hdog.c#包含 dog.h //子类构造函数实现void dog _ init (dog * this,int ag测试级主:
# includesdio.h # include 动物 #包含 dog.h int main{//在堆栈上创建一个animal对象;//构造对象animal_init(a,1,3);printf( 年龄= %d,体重= %d,animal_getage(a),animal _ getweight(a));//在堆栈上创建一个dog对象dog d;dog_init(d,6,9,4);printf( 年龄= %d,体重= %d,腿= % d \ n ,dog_getage(d),dog_getweight(d),dog _ get legs(d));返回0;}参考文档电子发烧友c语言应该如何面向对象编程?百度文库c语言实现面向对象编程waring:超越标量初始值设定项中的元素干货| c语言实现面向对象编程(附代码)c语言第八章函数、指针和宏标签:
函数子类
了解更多c语言结构的程序实例(c语言结构的向量运算)相关内容请关注本站点。