C++介面的定義與實現
1.介面的定義與實現
所謂的介面,即將內部實現細節封裝起來,外部使用者用過預留的介面可以使用介面的功能而不需要知曉內部具體細節。C++中,通過類實現面向物件的程式設計,而在基類中只給出純虛擬函式的宣告,然後在派生類中實現純虛擬函式的具體定義的方式實現介面,不同派生類實現介面的方式也不盡相同,從而實現多型。現通過一個簡單的例項講解具體實現步驟(⊙o⊙)。
1.1類介面的定義 通常在標頭檔案中完成類介面的定義 /*InterfaceDefineAndRealize.h*/
1.2 介面的實現 通常在原始檔中完成介面的實現 /*InterfaceDefineAndRealize.cpp*/#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
#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;
}
注:以上程式碼僅為個人理解,可能存在錯誤或敘述不正確的地方,希望給予指正,謝謝。