精华内容
下载资源
问答
  • C语言对象化编程

    千次阅读 2013-08-29 15:14:26
    Linux的源代码中C语言对象化 参考Linux内核的源代码中,有更好的使用 #include struct MyClass { char* name; int age; void (*funnull) (); void (*func) (struct MyClass mc); }; void ...


    以下为一个引子:

    C中struct的函数实现,只能用函数指针成员。

    C结构体内不能有函数的代码,但可以有函数的指针。

    C/C code

    Code highlighting produced by Actipro CodeHighlighter (freeware)

    http://www.CodeHighlighter.com/

    #include <stdio.h>
    
    struct test
    {
        void fun()
        {
            printf("hello,world\n");
        }
    };
    
    int main()
    {
        struct test _t;
        _t.fun();
        return 0;
    }



    上面的代码保存为.c, 在VC 6.0, Dev Cpp 里都通不过。
    函数指针方式实现,而不要直接定义函数 ...
    当然struct里能放函数指针的。比如这样:

    C/C code

    Code highlighting produced by Actipro CodeHighlighter (freeware)

    http://www.CodeHighlighter.com/

    #include <stdio.h>
    void fun()
    {
        printf("hello,world\n");
    }
     
    struct test
    {
        void (*Fun)();
    };
     
    int main()
    {
        struct test _t;
        _t.Fun = fun;
     
        (*_t.Fun)();
        return 0;
    }
     


    C结构体内不能有函数的代码,但可以有函数的指针
    网友回复:纯C中的struct没有成员函数,但可以有函数指针。
    Object-oriented programming with ANSI-C是用函数指针来模拟成员函数的。

     

    参考:http://blog.sina.com.cn/s/blog_502d82e10100fgl1.html


    Linux的源代码中C语言对象化

    参考Linux内核的源代码中,有更好的使用


    #include<stdio.h>
    
    struct MyClass
    {
            char* name; 
    
            int age;
            void (*funnull) ();
            void (*func) (struct MyClass mc);
    };
    
    void realfunnull()
    {
            printf("hello world!\n");
    }
    
    void realfunc(struct MyClass mc)
    {
            printf("MyClass's name is:%s\n",mc.name);
            printf("MyClass's age is:%d\n",mc.age);
    }
    
    int main()
    {
            struct MyClass mc = {"Simon", 25, realfunnull, realfunc};
            mc.funnull();
            mc.func(mc);
            return 0;
    }
    












    展开全文
  • C语言对象化设计的实例——LCD菜单

    千次阅读 2017-11-13 00:00:00
    这是我十三年前读研究生的时候写的系列文章《C语言嵌入式系统编程修炼》系列文章中的一小节,是一个用面向对象,把LCD上面菜单,对象化的例子。该文章原始出处: http://soft.yesky.com/lesson/188/2023188.shtml ...

     

    这是我十三年前读研究生的时候写的系列文章《C语言嵌入式系统编程修炼》系列文章中的一小节,是一个用面向对象,把LCD上面菜单,对象化的例子。该文章原始出处:

    http://soft.yesky.com/lesson/188/2023188.shtml


     菜单操作

      无数人为之绞尽脑汁的问题终于出现了,在这一节里,我们将看到,在C语言中哪怕用到一丁点的面向对象思想,软件结构将会有何等的改观!

      笔者曾经是个笨蛋,被菜单搞晕了,给出这样的一个系统:

    0?wx_fmt=jpeg
    图1 菜单范例


      要求以键盘上的"← →"键切换菜单焦点,当用户在焦点处于某菜单时,若敲击键盘上的OK、CANCEL键则调用该焦点菜单对应之处理函数。我曾经傻傻地这样做着:

    /* 按下OK键 */
    void onOkKey()
    {
     /* 判断在什么焦点菜单上按下Ok键,调用相应处理函数 */
     Switch(currentFocus)
     {
      case MENU1:
       menu1OnOk();
       break;
      case MENU2:
       menu2OnOk();
       break;
      …
     }
    }
    /* 按下Cancel键 */
    void onCancelKey()
    {
     /* 判断在什么焦点菜单上按下Cancel键,调用相应处理函数 */
     Switch(currentFocus)
     {
      case MENU1:
       menu1OnCancel();
       break;
      case MENU2:
       menu2OnCancel();
       break;
      …
     }
    }


      终于有一天,我这样做了:

    /* 将菜单的属性和操作"封装"在一起 */
    typedef struct tagSysMenu
    {
     char *text; /* 菜单的文本 */
     BYTE xPos; /* 菜单在LCD上的x坐标 */
     BYTE yPos; /* 菜单在LCD上的y坐标 */
     void (*onOkFun)(); /* 在该菜单上按下ok键的处理函数指针 */
     void (*onCancelFun)(); /* 在该菜单上按下cancel键的处理函数指针 */
    }SysMenu, *LPSysMenu;


      当我定义菜单时,只需要这样:

    static SysMenu menu[MENU_NUM] =
    {
     {
      "menu1", 0, 48, menu1OnOk, menu1OnCancel
     }
     ,
     {
      " menu2", 7, 48, menu2OnOk, menu2OnCancel
     }
     ,
     {
      " menu3", 7, 48, menu3OnOk, menu3OnCancel
     }
     ,
     {
      " menu4", 7, 48, menu4OnOk, menu4OnCancel
     }
     …
    };


      OK键和CANCEL键的处理变成:

    /* 按下OK键 */
    void onOkKey()

     menu[currentFocusMenu].onOkFun(); 
    }
    /* 按下Cancel键 */
    void onCancelKey()
    {
     menu[currentFocusMenu].onCancelFun(); 
    }


      程序被大大简化了,也开始具有很好的可扩展性!我们仅仅利用了面向对象中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。

      面向对象,真神了! 

    0?wx_fmt=gif

    点击阅读原文,进入《C语言嵌入式系统编程修炼》系列



    展开全文
  • 最近在看一本《c缺陷与陷阱》,意识到在大型程序时对象的声明与定义的重要性 普通变量的定义与声明 每个外部对象都必须在程序的某个地方进行定义。因此如果一个程序中包含了语句 extern int a;//声明变量a ...

    最近在看一本《c缺陷与陷阱》,意识到在大型程序时对象的声明与定义的重要性

    普通变量的定义与声明

    每个外部对象都必须在程序的某个地方进行定义。因此如果一个程序中包含了语句

    extern int a;//声明变量a
    

    那么,这个程序就必须在别处的某个地方包括语句

     int a;//代表定义外部int型变量a
    

    或者 

    int a=10;//定义变量a并初始化

    这两个语句既可以在同一个源文件中,也可以不在同一源文件中

     

     

    若一个变量前加了static修饰符

    static int a;//定义变量a,但变量a只在此文件中起作用

    static修饰符不仅适用于变量,也适用于函数。如果一个函数f()调用函数g(),且只有该函数f调用函数g,那么就可以把函数f函数g写在同一个文件中,并把函数g声明为static型的, 

     表明这个对象或者函数的作用域只在此文件中。

     

     

     

    函数的声明方式

    (作用域修饰符)返回值类型   函数名(参数表)

    函数的定义方式

    返回值类型  函数名 (参数表)

    {

       函数体

    }

     

     

    对C++编译器而言,当调用函数的时候,编译器只需要看到函数的声明。当定义类类型的对象时,编译器只需要知道类的定义,而不需要知道类的实现代码。因此,因该将类的定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。

    这样在用到对应的接口函数时只需包含xxx.h文件即可,在需要修改函数内容时只在xxx.cpp修改。如果需要修改接口则只需修改xx.h对应的接口,xxx.cpp对应的接口即可。

     

    展开全文
  • 静态对象创建 / 析构: rt_sem_init / rt_sem_detach 动态对象创建 / 析构: rt_sem_create / rt_sem_delete
  • C语言面向对象

    千次阅读 2017-08-30 17:01:24
    在我们的印象中,C语言是一个...所以一般的C语言项目中是或多或少会去尝试一些面向对象的设计的。那么用C 语言怎么实现面向对象呢?结构体+函数指针。基本就是这个套路了。比如我们想要定义一个Person 类。那么用Java

    在我们的印象中,C语言是一个面向过程的语言。应该是和面向对象没有什么关系的。但是在我们的实际开发中,如果我们真的决定使用C语言来完成一个大型的项目的化。纯函数式的编程,纯面向过程式的设计还是会让代码很难维护和理解的。

    所以一般的C语言项目中是或多或少会去尝试一些面向对象的设计的。那么用C 语言怎么实现面向对象呢?

    结构体+函数指针。基本就是这个套路了。

    比如我们想要定义一个Person 类。那么用Java的话,我们一般是这样定义的:

    public class Person {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    }

    使用的时候我们只需要这样使用即可

    Person person = new Person("jerry", 27);
    String name = person.getName();
    int age = person.getAge();
    person.setAge(50);
    person.setName("tom");

    那如果我们有C 语言的实现是怎么样呢?

    typedef struct _person{
        char name[128];
        int age;
        void (*setName)(struct _person * person, char* name);
        void (*setAge)(struct _person * pseron,int age);
        char *(*getName)(struct _person * person,int *len);
        int (*getAge)(struct _person * pseron);
    }Person;
    
    
    static void setName(struct _person * person, char* name){
        if(person == NULL)
            return;
        memcpy(person->name, name, strlen(name));
        return;
    }
    
    static void setAge(struct _person * person,int age){
        if(person == NULL)
            return;
        person->age = age;
        return;
    }
    static char * getName(struct _person * person, int *len){
        if(person == NULL)
            return NULL;
        *len = strlen(person->name);
        return person->name;
    }
    static int getAge(struct _person * person){
        if(person == NULL)
            return -1;
        return person->age;
    }
    
    Person * Person_new(char * name, int age){
        Person * person = NULL;
        person = (Person *)malloc(sizeof(Person));
        memset(person, 0, sizeof(Person));
    
        person->getAge = getAge;
        person->getName = getName;
        person->setName = setName;
        person->setAge = setAge;
    
        memcpy(person->name, name, strlen(name));
        person->age = age;
        return person;
    }
    
    void Person_delete(Person * person){
        if(person == NULL)
            return;
        free(person);
        return;
    }

    使用时代码这样编写

        Person * person = Person_new("jerry", 27);
        person->setAge(person, 50);
        person->getAge(person);
        int len;
        printf("person name : %s, age: \n", person->getName(person, &len), person->getAge(person));
        Person_delete(person);
        person = NULL;

    然后我们发现,在Java中我们不需要把person 本身作为参数传递给Person 类的方法。但是再C里面我们需要为每一个函数传递一个Person 结构体指针。因为在函数中如果操作Person 结构体的成员的话,必须要能访问到person ,所以我们要把这个结构体指针传入函数中。这样一看,感觉好像C 语言实现起来好别扭,其实不然。其实在Java 中如果我们要访问Person 类的成员,我们同样需要一个指向Person 对象的引用。只不过这一引用表现的比较含蓄,它就是this 关键字。而传入引用这个动作也不用我们在代码中显示的写出来。但我们完全可以把他们看成是一样的。Java的this 就是C里面的 person。这样是不是整个逻辑就通了。

    用C语言来表达面向对象的思想就是这么简单。没有太大的花头。

    展开全文
  • C语言面向对象编程

    2014-04-03 17:13:59
    面向对象编程是一种思想,只要运用这种思想,用C语言也能写出面向对象的程序。我们可以把C语言的结构体看成是面向对象语言中的类,结构体里可以有属性和成员函数(函数指针)。这样就能用C语言写出面向对象的序了。 ...
  • C语言基于对象编程实现部分多态功能03. 总结04. 下载05. 附录 01. 概述 在C语言中还可以实现更深入的面向对象编程多态特性。例如:使用接口(interface)包含多个指向函数的指针,这样就可以实现操作的"多态性"。 在...
  • C语言实现面向对象

    2016-07-21 21:40:55
    C语言虽然是一个面向过程的语言,它本身并没有提供的面向对象机制,但是通过合理的利用C语言提供的一些机制,可以简单的模拟出种种面向对象的基本特性。 (1)支持抽象数据类型:C语言中的结构体可以对具体的事
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    C语言 42.C语言是一种计算机高级语言。 43.C语言允许直接访问物理地址,能进行位操作。 44.C语言是结构化程序设计语言 45.c程序要通过编译,连接才能得到可执行的目标程序 46.用c语言编写程序,可以编写出任何类型的...
  • C语言写的面向对象框架的内核部分,由于刚刚开始写,内容仅包含底层核心。本来不想要币的,但发现自己居然没币了,所以,大家支持下哈。。 ^_^
  • C语言面向对象编程之基类。

    千次阅读 2017-10-24 17:24:43
    我们作为一个程序员,C语言...一开始,我们会发现,c语言里边会有结构体struct,和c++中的类是很相似的,同时C语言接头体里边可以包含函数指针,那么我们针对帧一点开始动手做自己的C语言面向对象lib。我们参考万物皆有
  • C语言结构体对象间直接赋值

    千次阅读 2017-08-03 10:20:29
    C语言中变量间互相赋值很常见,例如:int a,b; a = b;结构体也是变量(自定义变量),两个结构体之间直接赋值按道理应该也是可以的吧,说实话之前还从没遇到过将一个结构体对象赋值给另一个结构体对象的(见识太浅)...
  • 很多人认为,C语言编程,就是函数式编程,C++, JAVA等高级语言,才是面向对象编程。 其实,这是错误的认识!面向对象编程是一种思想,是一种编程思路,实现这种编程思路,不局限于是使用C语言还是使用C++语言。 ...
  • C语言面向对象(针对较大型软件
  • 如何用C语言实现面向对象

    千次阅读 2016-07-20 19:11:54
    C语言是一种结构化的编程语言,以...C语言本身对面向对象的支持很弱,但可以通过一些技巧来实现,从面向对象的思想上找一些对应的实现方法。 面向对象C语言: 类的实现 ———— 结构体 封装性  ————
  • C语言实现面向对象的思想

    千次阅读 2016-09-08 20:17:09
    C语言实现面向对象的方法,面向对象的三个基本特征,对象唯一性,继承性,抽象性。 使用C语言中的结构体和函数指针将数据与操作放在一起,使得一个问题的解决方法封装在结构体中。 其中结构体的嵌套使用实现了继承...
  • 最近百度面试过程中有同学被问到这样一个问题:如何用C语言实现面向对象?我们都知道面向对象的三大基本特征:封装、继承和多态,C++语言和编译器都对这些特征有着强有力的支持,但是对于C这样的函数式语言,如何...
  • C语言使用结构体实现面向对象编程
  • 轻量级的C语言面向对象编程框架

    千次阅读 2014-05-24 00:13:13
    轻量级的C语言面向对象编程框架
  • 重要应用面向对象编程思想回调函数5. 完整示例 1. 函数指针 函数指针是个普通指针,但是写法略不同于一般的指针 1.1 如何定义 函数在结构体外定义,例: // 原函数 int add(int a, int b) {return a + b;} ...
  • C语言中的面向对象

    千次阅读 2013-08-23 11:07:47
    不过,我们都知道,Linux内核的编写基本都是用C语言实现的(其中包含内联的汇编),同时,我们也知道,C语言是典型的面向过程语言,它是怎么实现面向对象的呢? Linux内核的开发人员都是绝顶聪明的人,他们利用...
  • C语言对象
  •   As we all konw,Linux操作系统大部分都是用C语言写的,而在编写linux中,大佬们优美的应用C语言写出了OO(面向对象)的操作系统。   关于Linux内核中利用的OO思想的具体体现,网上有很多好的文章,我在这就不...
  • c语言如何实现面向对象编程

    千次阅读 2019-12-01 13:57:04
    C语言是面向过程的一门语言,C++是面向对象,这个特性早已深入人心。但是嵌入式底层以及大型操作系统等却都是用C开发的。如果只用面向过程去开发这类大型软件,肯定行不通。 因此,C语言也可以用面向对象的思维去...
  • 面向对象一直是一种思想,C语言也可以实现其思想。面向对象思想: 封装 继承 构造函数 多态 1、封装封装就是犹抱琵琶半遮面,使用结构体。2、继承linux内核里用到类的继承关系,这种关系使用C语言实现就是结构体的...
  • 如何用C语言实现面向对象思想的开发?现状实现方法优势 现状 目前各行各业中的软件工程师规模庞大,种类繁多,但是有一小众化的软件工程师往往受到忽视,那就是嵌入式软件工程师,对于小众化的嵌入式软件工程师其实...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 312,237
精华内容 124,894
关键字:

c语言对象

c语言 订阅