标签:相同 start strong 导入 入库 无法找到 理解 取名字 而在
1.接口的定义与实现
所谓的接口,即将内部实现细节封装起来,外部用户用过预留的接口可以使用接口的功能而不需要知晓内部具体细节。C++中,通过类实现面向对象的编程,而在基类中只给出纯虚函数的声明,然后在派生类中实现纯虚函数的具体定义的方式实现接口,不同派生类实现接口的方式也不尽相同,从而实现多态。现通过一个简单的实例讲解具体实现步骤(⊙o⊙)。
1.1类接口的定义 通常在头文件中完成类接口的定义 /*InterfaceDefineAndRealize.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
1.2 接口的实现 通常在源文件中完成接口的实现 /*InterfaceDefineAndRealize.cpp*/
- #include "InterfaceDefineAndRealize.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;
- }
1.3 接口的导出 通常在模块定义文件中完成 /*InterfaceDefineAndRealize.def*/
- LIBRARY InterfaceDefineAndRealize
- EXPORTS
- GetPersonObject
新建项目,加载上述三个文件,设置项目属性—>配置属性——>常规——>配置类型 ,选择"动态库.dlll",生成可用的动态库,假如项目名称为InterfaceDefineAndRealize(注意:项目名称必须与模块定义文件中 LIBRARY 后面定义的名字相同,否则将导致出现无法找到动态库的错误。),则在该项目的当前工作目录下位生成动态库和它的导入库。
2. 接口的调用
为了与常规的调用动态库的方式保持一致,这里做一些额外工作。新建“include”文件夹,并将InterfaceDefineAndRealize.h放到此文件夹下,新建“lib”文件夹并将InterfaceDefineAndRealize.lib文件放到此文件夹下。新建项目UsingInterface,添加源文件实现调用接口的功能。
2.1 为项目添加附加包含目录
方法1:项目属性——>配置属性——>C/C++——>常规——>附加包含目录 将include文件夹的全路径添加进来。
方法2:项目属性——>配置属性——>VC++目录——>包含目录 中将include文件夹的全路径添加进来。
2.2 为项目添加附加库
方法1:项目属性——>配置属性——>链接器——>常规——>附加库目录 将lib文件夹的全路径添加进来。
方法2:项目属性——>配置属性——>VC++目录——>库目录 将lib文件夹的全路径添加进来。
注意:2.1中的方法1与2.2中的方法1对应,2.1中的方法2与2.2中的方法2对应,不能不换使用。
2.3 为项目添加导入库
项目属性——>配置属性——>链接器——>输入——>附加依赖项 中添加InterfaceDefineAndRealize.lib
2.4 为项目提供动态库
将生成的.dll动态库放到项目的当前目录下的Debug目录下,防止出现缺少动态库的错误。
2.5 编写代码,实现接口的调用
- #include <iostream>
- #include "InterfaceDefineAndRealize.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("zhang hui");
- std::cout<<person->GetName()<<std::endl;
- person->Work();
-
- if(person!=NULL)
- {
- delete person;
- person=NULL;
- }
- }
- system("pause");
- return 0;
- }
注:以上代码仅为个人理解,可能存在错误或叙述不正确的地方,希望给予指正,谢谢。
C++接口的定义与实现的详细过程
标签:相同 start strong 导入 入库 无法找到 理解 取名字 而在
原文地址:http://www.cnblogs.com/KunLunSu/p/6443882.html