C 语言利用动态库实现C++中的对象

Posted 姚家湾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言利用动态库实现C++中的对象相关的知识,希望对你有一定的参考价值。

众所周知,C++ 是面向对象程序设计语言,而C语言并不是面向对象的程序设计语言。那么,C 语言能否实现面向对象程序设计么?它的实际意义又如何呢? 本文谈谈这个问题。

实际意义

       C++ 语言比较庞大,在嵌入式系统中,C语言更加适合。比如在RT-Thread OS 中,OS 本身是C语言实现的。应用程序可以使用C++实现面向对象程序设计。但是许多场合需要C 语言接口。例如 当实现动态库模块时,好像无法使用C++来实现动态库。如此一来,程序注定是C与C++ 混搭模式实现。

   当你采取了面向对象程序设计时,程序结构也随之改变。比如对象的创建。当你希望动态库也能够创建多个对象。

  因此,如果C 语言能够实现简单的对象。能够带来许多便捷。使程序更加清晰。

使用C 语言实现简单的对象,是有实际意义的。

使用C 实现对象

  通俗地讲,所谓对象就是一堆数据以及对其操作的函数构成的软件组件。所以我们可以写出一个及其简单的类

在C++中的创建一个类"Person"。

//Person.h
class rectangle
{
private:
    int width
    int height;
    int pos_x;
    int pos_y;
    int color;
public:
    rectangle(int width,int height);    //constructor
    ~rectangle();    //destructor
    void move(int x,int y);
    void fillColor(int Color);

};
 

用C语言来表示上面的类,我们可以使用结构体,并用操作结构体的函数表示成员函数。

typedef struct _Rectangle
{
     int width
    int height;
    int pos_x;
    int pos_y;
    int color;
} Rectangle;
 
   void  new_rectangle(int width,int height);    //constructor
   void delete_rectangle();    //destructor
   void move(int x,int y);
   void fillColor(int Color);
 

数据隐藏和static变量

        我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。

 在下面的例子中,你可以视同x 是一个全局变量,但是作用域仅限于_X 函数。局部变量用关键字 static 声明为“静态局部变量”

int _X(){
static x=0;
return x;
}

 静态全局变量

静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。

实例化

  C语言实现继承和多态 这篇文章讲的比较详细。我这里介绍另一种方式。使用C 语言的动态库实现对象实例化。

将上面的C 语言程序改写为:

typedef struct _Rectangle
{
     int width
    int height;
    int pos_x;
    int pos_y;
    int color;
} ;
static struct _Rectangle Rectangle;
 
   void  new_rectangle(int width,int height);//constructor
   void delete_rectangle();    //destructor
   void move(int x,int y);
   void fillColor(int Color);

注意:static 关键字。

将其编译成动态库函数。

        每次导入一次动态函数rectangle,就新建一组static 数据。并且使用不同的动态库handle 来调用不同的对象。

以上是关于C 语言利用动态库实现C++中的对象的主要内容,如果未能解决你的问题,请参考以下文章

C++对象的动态建立与释放

Java反射

C语言实现动态结构体数组

详解C++标准库<sstream>中的类stringstream,并利用它实现OpenCV下的图片批量读取

C++反射:深入浅出剖析ponder库实现机制!

c++中为啥要用new 函数()实现多态?