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