c++接口实现

来源:互联网 发布:mac客人用户退出不了 编辑:程序博客网 时间:2024/06/06 01:58

接口的定义与实现
所谓的接口,即将内部实现细节封装起来,外部用户用过预留的接口可以使用接口的功能而不需要知晓内部具体细节。
在C++中,通过类实现面向对象的编程,而在基类中只给出纯虚函数的声明,然后在派生类中实现纯虚函数的具体定义的方式实现接口,不同派生类实现接口的方式也不尽相同,从而实现多态。
代码时刻

//编程环境:VS2013 c++

1.类接口的定义

//Interface.h#ifndef INTERFACE_DEFINE_AND_REALIZE#define INTERFACE_DEFINE_AND_REALIZE#include <string>using std::string;class Person//基类{public:    Person():m_StrName("***") //成员列表初始化参数    {};    virtual ~Person(){};    virtual void Eat()=0;//人需要吃东西    virtual void Sleep()=0;//人需要睡觉    virtual void SetName(const string strName)=0;//人都有名字    virtual string GetName()=0;//获取名字    virtual void Work()=0;//人可能要有工作private:    string m_StrName;};//实现接口//实现接口是通过派生类实现的,每个派生类依据自身特点,可以获取同一接口的不同实现,也就是所谓的多态。class Student:public Person{public:    Student():m_strName("***")    {};    ~Student()    {};    void Eat();    void Sleep();    void SetName(const string strName);    string GetName();    void Work();private:    string m_strName;};#endif

2.类接口的实现

//Interface.cpp#include "Interface.h"#include <iostream>#include <string>using std::string;using std::cout;using std::endl;//接口的外部实现void Student::Sleep(){    cout<<"student sleep."<<endl;}void Student::Eat(){    cout<<"student eat."<<endl;}void Student::SetName(const string strName){    m_strName=strName;}void Student::Work(){    cout<<"student work."<<endl;}string Student::GetName(){    return m_strName;}//需要导出的函数,即用户在外部可以调用的接口_declspec(dllexport)bool GetPersonObject(void** _RtObject){    Person* pMan=NULL;//创建一个新指针对象并将赋值给调用的接口对象,返回为真    pMan=new Student();    *_RtObject=(void*)pMan;    return true;}

3.接口的导出

//Interface.defLIBRARY Interface//这里Interface必须与你的项目名称相同EXPORTSGetPersonObject

新建项目,项目名称为Interface,加载上述三个文件,设置项目属性—>配置属性——>常规——>配置类型,选择 “动态库.dlll”,点击F5启动调试,可在当前项目目录生成可用的动态库(即Debug文件夹中的Interface.dll文件),则在该项目的当前工作目录下位生成动态库和它的导入库。

为了与常规的调用动态库的方式保持一致,这里做一些额外工作。在当前工程目录下新建“include”文件夹,并将Interface.h放到此文件夹下,新建“lib”文件夹并将Interface.lib文件(应该在本层或上层Debug文件夹下)放到此文件夹下。

4.接口的调用
新建项目test,添加源文件实现调用接口的功能。
(1)为当前项目添加附加包含目录
项目属性——>配置属性——>C/C++——>常规——>附加包含目录 将刚刚Interface工程中的include文件夹的全路径添加进来。
(2)为当前项目添加附加库
项目属性——>配置属性——>链接器——>常规——>附加库目录 将将刚刚Interface工程中的lib文件夹的全路径添加进来。
(3)为当前项目添加导入库
项目属性——>配置属性——>链接器——>输入——>附加依赖项 中添加将刚刚Interface工程中的Interface.lib。
(4) 为当前项目提供动态库
将刚刚Interface工程中生成的Interface.dll动态库,放到test项目的当前目录下的Debug目录下(感觉首先需要自己先运行一次程序才会出现Debug目录),防止出现缺少动态库的错误。

5.测试,调用接口

//test.cpp#include <iostream>#include "Interface.h"bool _declspec(dllimport) GetPersonObject(void** _RtObject);int main(){    Person* person=NULL;    void* pObj=NULL;    if(GetPersonObject(&pObj))//调用接口    {        person=(Person*)pObj;        person->Eat();        person->Sleep();        person->SetName("xiaochen");        std::cout<<person->GetName()<<std::endl;        person->Work();        if(person!=NULL)//释放        {            delete person;            person=NULL;        }    }    system("pause");    return 0;}
原创粉丝点击