C++接口封装

转载 2018年04月17日 16:14:41

在产品开发过程中,我们经常会需要对外提供DLL的接口,这种接口可以在产品开是设计好的,也可能是在基本功能开发完成进行封装的,这里将介绍一种比较基本常用的封装方法,供初学者参考。欢迎提出好的改进方式。

先提几点要求,包含我们的目标、要求和本文范围等,

  • 1、对外提供的文件清晰,只包含必需的头文件、DLL文件及LIB文件
  • 2、不暴露用户不需要知道的多余信息
  • 3、这里只设计封装过程与思路,包含DLL相关的实现以及代码工程配置等信息

首先你可以先配置好你想发布的目录文件夹,

例如:包含三个对外发布的文件夹,名称分别为BIN、INCLUDE、LIB,BIN里放发布所需要的DLL,INCLUDE只存放发布的头文件,LIB文件夹里放生成的LIB文件

你的实现的工程文件放在工程文件夹里就可以了

//---------------------接口文件 IMyDLL.h ------  //这个文件应该放在对外发布的INCLUDE文件下,供外部使用

// 这个是对外发布的接口,这个文件里只包含对外提供的方法,不会包含私有方法和属性

class IMyDLL        // 这个类是对外发布的,所有方法均是纯虚的,不会暴露实现

{

public:

     virtual void Init() = 0;  // 纯虚的,对外的都是纯虚的

//  privata:

//  int a;          // 这样的属性不是对外发布的,就不把它放在对外接口头文件里

}

//-------------------实现文件 MyDLLImpl.h --------

//继承IMyDLL

#include "IMyDLL.h"  // 这个是具体实现的类,放在工程文件目录下就可以了,不需要对外发布

class CMyDLLImpl : public IMyDLL   // 从对外接口类继承,负责具体实现

{

public:

      virtual void Init(); // 如果还设计为可被继承,就写成虚的,不是虚的普通方法也可以,这个地方有个是否使用虚析构的问题,要注意,不明白的话认真查下资料

privata:

      int a; //这个地方可以有,因为用户看不见

}

//-----------------实现文件 MyDLLImpl.cpp -------- // 这个是方法实现文件,没有什么好说的,放在工程目录下

#include "MyDLLImpl.h"

void CMyDLLImpl::Init() 

{

  ;  //真正实现的代码

//  这里可以使用声明过的变量a

}

上面的就是整个封装的框架,下面是最重要的一步,提供用户创建对象的方法,因为前面对外发布的为抽象类,用户不能创建实例,所以:

// MyDllFactory.h // 对外发布

#include "IMyDLL.h"

class MyDllFactory

{

  IMyDLL* Create();  // 提供一个创建对象的方法      

}

// MyDllFactory.cpp

#include "MyDllFactory.h"

#include "MyDLLImpl.h"   // 注意这个很重要,由于是在CPP里,

IMyDLL* MyDllFactory::Create()

{

return new CMyDLLImpl;

}

MyDllFactory类也可以写到对外接口的头文件中,因为这里只有1个方法,可以减少维护的文件数据,我经常把它和接口头文件写在一起。

对象的创建方法可能会有很多,可以根据实现情况进行修改,比如使用工厂模式、对象工厂等方法。

这样封装过程就完了,提供给用户的是MyDllFactory.h、IMyDLL.h、DLL文件和LIB文件

对外提供的文件中看不到任何多余的东西,用户调用的过程大概是这样的:

#include "MyDllFactory.h"

void f()

{

MyDllFactory factory;

IMyDLL* pDll = factory.Create();  //这样就创建出对象了

pDll ->Init();

}



提供接口,函数参数除了原生类型,其它的全部传指针。不要对外暴露锁,尽量不要让调用者手工分配内存。所有的数组必须带长度。所有的函数调用应该有返回值,所有的错误有清晰的描述。windows下保存好pdb。接口中必须有一个查询版本号的接口。不对历史接口做扩展,而是添加新接口。最后就是写一个接口手册。
提供API从用户的角度来讲,不要让API变来变去,可以增加新的API,并做好版本控制或则调用时版本的验证检查
用开发者的角度来说,尽量能让程序自动识别不同的平台差异,如大小端、字节对齐等,并且避免使用依赖于平台的一些库

API的参数可以使用指针及结构体,便于以后参数扩展,并且参数传递效率也比较高。


数据类型在不同的平台上可能会出现长度不一致,所以你需要处理这种情况,至于内存管理,就需要谁申请的就让谁释放,如果你的接口内部申请了内存供外部使用那么一定要提供接口让外部调用去释放内存(因为内存管理的库会存在差异)

接口
: 接口描述了类的行为和功能,而不需要完成类的特定实现。
C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。

如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:

class Box
{
   public:
      // 纯虚函数
      virtual double getVolume() = 0;
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};

设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重载纯虚函数,就尝试实例化该类的对象,会导致编译错误。




c++关于封装、接口的简单理解

类是 面向对象程序设计语言中的一个概念。 类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。 类成员有3种不同的访问权限: 1)公有( public )成员可以在...
  • u013052732
  • u013052732
  • 2014-03-29 10:54:11
  • 882

[C++]关于接口的设计与声明--对封装性的理解

设计与声明 所谓软件设计,是“令软件做出你希望它做的事情”的步骤和方法,通常以颇为一般性的构想开始,最终十足的细节,以允许特殊接口(interface)的开发。这些接口而后必须转换为C++声明式。...
  • stary_yan
  • stary_yan
  • 2016-04-28 17:41:01
  • 6084

将C++接口封装成C函数

在某些情况下,需要将C++的接口封装成C函数。 --------------------------------------首先,我们准备一个C++的so文件,它由以下h和cpp文件生成: [chen...
  • flykobesummer
  • flykobesummer
  • 2009-08-10 10:24:00
  • 1473

MySQL C++接口封装

CppMysql.cpp /** @file CppMysql.cpp * @note Hikvision Digital Technology Co., Ltd. All Rights...
  • HuaXiaYuShao
  • HuaXiaYuShao
  • 2014-09-12 08:47:19
  • 592

Rust或C#,Python 等如何封装C++的接口 (比如CTP)?

各种原因吧,与交易相关方面的原生接口大多是用C++来写的,比如CTP,飞马,飞创等。华宝的LTS,中泰的XTP估计也差不多。 正是因为此,也让很多人苦B了,因为并不是所有的人都善于或者喜欢用C++来...
  • wowotuo
  • wowotuo
  • 2017-04-01 22:16:13
  • 2077

消息队列接口的简单封装

//头文件msgipc_msg.h #ifndef _WBM_MY_MSG_H_ #define _WBM_MY_MSG_H_ #include #include #include #inclu...
  • w451062810
  • w451062810
  • 2017-01-15 22:17:05
  • 217

使用C++模板封装SQLite(完整版)

    SQLite 是一款开源的嵌入式数据库,由于本身小巧玲珑,比较适合作为应用软件的一部分嵌入到程序中,SQLite提供了一套简单易用的C API供应用程序调用,  但由于API的使用比较繁杂,并...
  • gaojl0728
  • gaojl0728
  • 2008-11-24 18:36:00
  • 6526

Redis/MongoDB 接口封装(C++)

  • 2013年10月25日 17:36
  • 376KB
  • 下载

JNI与C/C++的调用与封装(应用)

> 项目中使用JNI的地方,如:核心逻辑,密钥,加密逻辑。JNI还有很多的应用,比如FFMPEG,OpenGL等。JNI常见的场景如:加解密算法,音视频编解码等。C/C++实现的算法,J...
  • ShareUs
  • ShareUs
  • 2017-03-28 18:37:36
  • 836

C++封装python接口(libboost-python)

摘要在Python技术文档中可以找到关于Python与C++之间相互调用的部分。分别叫做extending和Embedding。可以参考技术文档Extending and Embedding the ...
  • SUN_DRAGON
  • SUN_DRAGON
  • 2016-07-13 17:34:56
  • 2844
收藏助手
不良信息举报
您举报文章:C++接口封装
举报原因:
原因补充:

(最多只允许输入30个字)