使用C语言结构体模拟C++的类

c语言是面向过程的编程语言,而C++是面向对象的编程语言,在C++中有类这一说,类中封装了方法,对象等内容,使用时可以直接使用类来调用类中的对象和方法,但C中没有这个概念,但是可以通过构造结构体实现同样的功能。所以我们通过c语言来模拟类的功能。

通过将自定义函数指针加入到自定义的结构体中,通过调用结构体间接调用函数就可以达到目的。

例如:实现在自定义结构体中构造函数指针成员来调用对应的函数,一个函数的功能是对数组进行赋值,第二个函数是打印输出数组的内容,当然数组也作为结构体成员被定义出来,即结构体类型大致如下:

struct fun
{
    int a[10];
    int len;
    //函数1
    //函数2
};

首先确定函数1的形参和返回值类型,再定义一个指向该类型的函数指针。

typedef int*(*p)(int a[],int);               //函数指针类型重命名

int* insert(int a[],int n)                   //函数1的实现
{
    int *p=a;
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    return p;
}

函数2实现步骤也一样

void (*q)(int* ,int);           //指向函数2的指针类型重命名

void print(int*p,int n)         //函数2的实现
{
    for(int i=0;i<n;i++)
        printf("%d ",*(p+i));
}

确定之后就可以确定结构体中的函数指针的定义了。

struct fun
{
    int a[10];
    int n;
    p p1;             //使用已经重命名的类型名进行定义,可以指向函数1的指针p1
    q p2;             使用已经重命名的类型名进行定义,可以指向函数2的指针p2   
};

最后就是在main函数中访问结构体成员来调用函数了。

 

#include <strings.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef int* (*p)(int a[],int) ;
typedef void (*q)(int *,int n) ;
int* insert(int a[],int n)
{
    int *p=a;
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    return p;
}
void print(int*p,int n)
{
    for(int i=0;i<n;i++)
        printf("%d ",*(p+i));
}
struct fun
{
    int a[10];
    int n;
    p p1;
    q p2;
};
int main(int argc, char *argv[])
{ 
    int *r=NULL;              //定义指针r用于接收insert函数的返回值
    struct fun test;         //定义结构体变量test
    test.p1=insert;          //访问test中的指向函数1的成员变量p1来指向insert函数
    r=test.p1(test.a,10);    //使用p1调用函数
    test.p2=print;            //访问test中的指向函数2的成员变量p2来指向print函数
    test.p2(r,10);           //使用p2调用print函数

    return 0;
} 

结果如下: 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值