在C语言里怎么实现类的功能??非常感谢!!

解决方案 »

  1.   

    struct cls
    {
    int i;
    char c;
    int geti()
    {
    return i;
    }
    };
    int main(int argc, char* argv[])
    {
    struct cls test;
    test.i = 6;
    printf("%d\n", test.geti());

    return 0;
    }
    上述代码用.cpp文件可以编译,但用.c的不行,报function cannot be member of struct 'cls'错,说明纯C不支持结构体实现类。
      

  2.   

    struct cls
    {
    int i;
    char c;
    int geti()
    {
    return i;
    }
    };
    int main(int argc, char* argv[])
    {
    cls test;
    test.i = 6;
    printf("%d\n", test.geti());

    return 0;
    }
      

  3.   

    楼上的不要搞错,你用的STRUCT是C++的STRUCT,而不是C的STRUCT!C++的STRUCT当然和类没什么区别了!现在是要在C语言里实现呀!!!
      

  4.   

    同意westfly(西翔) 的,
    用子函数实现好了,
      

  5.   

    C中是可以实现“类”的,比如linux下的VFS,其底层是系统调用,其实是用指针指向“mount"的FS的函数,各种“文件系统”是用union类型组合的,加上FS自身的信息,总体构成”FS“类,叫”Vitual File System".
      

  6.   

    比如
    typedef struct VFS{
         char fsname[256];
         struct fsfile *filep;    /* 指向某种文件系统的文件结构类型 */
         typedef union fss{       /* 确定安装的文件类型 */
          msdos, 
          ext2,
          ext3,
          iso9660,
          ffs,
          ufs,
          ntfs,
          ,,,} *fsp;      struct fss  *iop{
                fsp * read;
                fsp * write;
                fsp * open;
                 ...
        };
       ....
    };
          写得可能有误,但基本思想是这样的。
      

  7.   

    当你用系统调用时,系统调用的接口是一致的!
    但其实是系统调用又调用相应的FS的操作,这样就实现了对程序员“隐藏”设备特性的目的,也就是“封装”,这样也实现了“一致的I/O"操作,这样也实现了将”设备“同”文件“一样的操作,所以有”设备文件“这个术语。
    可以参阅linux的fs 和 IO 部分,还可以去看看系统调用的声明部分,你会发现,系统调用其实是指向函数的指针,这样也实现了”多态“和”重载“!
      

  8.   

    是呀,用结构可以模拟C++的类。但是类是面向对象的。C的结构不能像类一样被继承,堕胎等面向对象的特征。建议你找C++编译器。计算机上的操作系统基本上都有C++编译工具吧
      

  9.   

    继承的机制是可以用函数指针表实现的,否则,VFS岂非没意义?
    可以用一级指针实现“类”,就可以用二级,三级指针实现“继承”!
    单继承相对来说简单些,而多继承就难得多了,但Java就仅提供单继承,
    因为多继承会带来语义上的问题,所以Java不支持,而C++是源自C,是可以
    以上述机制实现的,所以支持!
      

  10.   

    澄清一下,结构体中的函数指针本身就是“虚函数”,如果不能“继承”,
    怎么实现呢?可以肯定的说,C是非常灵活的,她是可以模拟任何语言特征的,关键是程序员的设计思想问题。否则,C++怎么能在C的基础上实现呢?
      

  11.   

    这一点,在操作系统上体现的非常完美!大家可以多多阅读一下源代码,尤其
    是FS和I/O部分,无论是windows,还是Linux,都是用前述机制实现“设备驱动程序”的,在网络部分,由于要兼容各种协议,也用了上述机制,比如NetBIOS,TCP/IP,IPX/SPX等。注意,现代操作系统大都是用C,而不是C++!
    但现代操作系统几乎都用了面向对象的机制!Windows2000/XP上,这个特征是
    非常明显的!推荐源码《操作系统设计与实现(上/下册)》,是minix源码。
    参考《windows操作系统原理》,《linux编程白皮书》。
      

  12.   

    用结构模拟类。《inside OLE》中用结构模拟了类的vtable和vptr,非常巧妙。
      

  13.   

    2码事,c是面向过程的,c++是面向对象的~!c的结构体不可能实现类的功能~!
      

  14.   

    谁说C的结构不能实现类的功能:
    struct tagCClass;
    typedef struct tagCClass CClass;
    int Fuc1(int ,int);
    int Fnc2(char*);void Class_Init(CClass* this )
    {
        this->classmember1 = 0;
        this->classmember2 = 0;
        this->MemberFunc1 = func1;
        this->MemberFunc2 = fucn2;
    }
        
    struct tagCClass
    {
         int classmember1;
         int classmember2;
         int (*MemberFunc1)(int,int);
         int (*MemberFunc2)(char*);
    }
    虽然在单纯的C语言中没有继承性,但数据的封装是可以实现的。
      

  15.   

    C++ 能实现的, C 全能实现!
    只不过你们不懂而已。
    用过 SCO 的同学们不妨看看 C++ 的编译程序 CC 到底是个什么东西!其实就是一个批处理,最后还是用 cc -- C 的编译程序来编译的。在 yndfcd(YNDFCD)的例子中,如果将
    int Fnc2(char*);
    改成
    static int Func2(char*);
    效果会更好!
      

  16.   

    另外再补充一句: 就算是用汇编语言, 也照样能使用 OOP 的思想进行编程!------------------------------------------------------------------
                                   语言只不过是工具, 最重要的是思想.
      

  17.   

    同意,绝对能够用C来完成C++的所有功能!但是,你用C来完成了,偶也可以保证:结构性,严密性,安全性,甚至运行速度都不会比现有的C++好,不过楼主的话题是拓展思路的好东东,程序员也应该多问问为什么!