美文网首页
如何实现一个C++库的头文件

如何实现一个C++库的头文件

作者: crazyhank | 来源:发表于2019-03-24 21:21 被阅读0次

    在实际项目中,我们可能用C++语言开发了一个库,并且提供头文件给第三方来调用,一般的做法是封装一个C库的接口,这样C语言和C++语言开发者都可以调用这个库。但是,如果只提供C++的类接口给别人调用的话,又该如何实现呢?

    我们以一个简单的例子说明,比如我们想提供的C++头文件和功能接口如下:

    $vim ICircle.hpp

    #ifndef CIRCLE
    #define CIRCLE
    class Circle {
    public:
            virtual double area() = 0;
    };
    
    class CircleMgr {
    public:
            static Circle* createCircle(double radius);
            static void destroyCircle(Circle* c);
    };
    
    #endif
    

    这里定义了一个Circle类和一个Circle管理类:CircleMgr,提供功能接口函数是area,计算circle的面积。用户调用的顺序是先通过CircleMgr类的静态成员函数常见一个Circle示例,然后根据这个Circle示例的area方法,调用完后再调用CircleMgr类的静态成员函数destroyCircle函数销毁之前创建的Circle对象。

    然后我们来看一下这个Circle类以及CircleMgr类的真正实现:

    $vim CircleImpl.cpp

    #include <iostream>
    #include "ICircle.hpp"
    
    class CircleImpl: public Circle {
    public:
            CircleImpl() {};
            CircleImpl(double r) {radius = r;}
            ~CircleImpl() {};
    
            virtual double area();
    
    private:
            double radius;
    };
    
    double CircleImpl::area()
    {
            return radius * radius;
    }
    
    Circle* CircleMgr::createCircle(double radius)
    {
            Circle* realCircle = new CircleImpl(radius);
    
            return realCircle;
    }
    
    void CircleMgr::destroyCircle(Circle* c)
    {
            if (c)
                    delete c;
    }
    

    这里我们的CircleImpl实现类继承了Circle类,并且实现了area纯虚函数,而在CircleMgr类的createCircle成员函数中则是创建了CircleImpl类的对象。

    最后我们看下如何根据这个C++头文件调用相关功能接口:

    $vim main.cpp

    #include <iostream>
    #include "ICircle.hpp"
    
    using namespace std;
    int main()
    {
            Circle* myCircle = CircleMgr::createCircle(2.0);
    
            cout << "area = " << myCircle->area() << endl;
    
            return 0;
    }
    

    $ ./main
    area = 4

    相关文章

      网友评论

          本文标题:如何实现一个C++库的头文件

          本文链接:https://www.haomeiwen.com/subject/bmspvqtx.html