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

2019-03-24  本文已影响0人  crazyhank

在实际项目中,我们可能用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

上一篇下一篇

猜你喜欢

热点阅读