1.接口的定義與實現
所謂的接口,即將內部實現細節封裝起來,外部用戶用過預留的接口可以使用接口的功能而不需要知曉內部具體細節。C++中,通過類實現面向對象的編程,而在基類中只給出純虛函數的聲明,然后在派生類中實現純虛函數的具體定義的方式實現接口,不同派生類實現接口的方式也不盡相同,從而實現多態。現通過一個簡單的實例講解具體實現步驟(⊙o⊙)。
1.1類接口的定義 通常在頭文件中完成類接口的定義 /*InterfaceDefineAndRealize.h*/
- #ifndef INTERFACE_DEFINE_AND_REALIZE
- #define INTERFACE_DEFINE_AND_REALIZE
- #include <string>
- using std::string;
- //define interface
- 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;
- }
注:以上代碼僅為個人理解,可能存在錯誤或敘述不正確的地方,希望給予指正,謝謝。
