亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現“隱藏實現,開放接口”的方案

2020-01-26 15:01:14
字體:
來源:轉載
供稿:網友

為什么要有接口?

接口就是一個程序與其它程序交流的窗口。就比如有一個電視機,我并不需要知道它是怎樣工作的,我只要知道按電源鍵就可以開啟電視,按節目加(+)減(-)可以切換電視頻道就可以了。

Java程序員都知道Java中有interface可以實現對外的接口,但C++并沒有接口這樣的語法,那它要好怎樣實現對外提供接口呢?我們可以通過純虛函數定義一個抽象類,專門用來聲明一個類的功能。

我們完成了一個程序模塊的開發,要把這個程序模塊給別人用,你肯定不會把源代碼給他(那別人就完全撐屋你的技術了),你會把這個程序模塊編譯成一個庫(靜態庫lib或動態庫dll)再給別人用。那別人拿到你的庫后怎樣用呢?這就需要看你的程序所提供的接口。C++的封裝性是特別好的(個人覺得比Java好多了,Java打成的jar包很容易就可以被反編譯,C++要反編譯就困難多了),我只要給你編譯出的庫和接口的頭文件就可以了。

從一個實例講講實現方案

需要

我們先來看一個場景。假設有一個電子文檔(Document)、一個文檔下有多個頁(Page),每個頁下有多個文本單元(TextUnit,表示文檔內元素的基本單位),一個文檔中的所有文本單元對象都有唯一的ID。其類圖關系如下:

圖1 :類的關系圖 

設計

根據需求,我們可以定義三個類Document、Page、TextUnit分別表示文檔、頁、文本單元,每個類我們還需要一個對外的接口,于是需要三個對外的接口類IDocument、IPage、ITextUnit。
根據這些類我們先創建.cpp文件和.h文件,組織一下工程(EBook)目錄結構如下:

圖2: 工程目錄結構

這里Document、Page、TextUnit就是具體的實現類,IDocument、IPage、ITextUnit就是對外提供的接口,這樣就實現了實現與接口分離。

代碼實現

IDocument.h:#pragma onceclass IPage;class IDocument{public:virtual ~IDocument(void){}public://---------------------------------------------------------------//function: // GenerateId 生成本文檔內唯一的文本對象ID//Access:// virtual public //Parameter://Returns:// int - 返回ID//Remarks:// ...//author: luoweifu//---------------------------------------------------------------virtual int GenerateId() = 0;//---------------------------------------------------------------//function: // AddPage 添加一頁//Access:// virtual public //Parameter://Returns:// IPage* - 返回頁對象//Remarks:// ...//author: luoweifu//---------------------------------------------------------------virtual IPage* AddPage() = 0;};IPage.h:#pragma onceclass ITextUnit;class IPage{public:virtual ~IPage(void){}public://---------------------------------------------------------------//function: // AddTextUnit 添加一個文本單元//Access:// virtual public //Parameter://Returns:// ITextUnit* - 文本單元對象//Remarks:// ...//author: luoweifu//---------------------------------------------------------------virtual ITextUnit* AddTextUnit() = 0;};ITextUnit.h#pragma onceclass ITextUnit{public:~ITextUnit(void){}public://---------------------------------------------------------------//function: // GetId 獲得ID//Access:// virtual public //Parameter://Returns:// int - 返回ID//Remarks:// ...//author: luoweifu//---------------------------------------------------------------virtual int GetId() = 0;//---------------------------------------------------------------//function: // SetId 設置ID//Access:// virtual public //Parameter:// [in] int id - 要設置的ID//Returns:// void - //Remarks:// ...//author: luoweifu//---------------------------------------------------------------virtual void SetId(int id) = 0;};

提供C接口

從上面的代碼我們可以看到IPage可以由IDocument創建,ITextUnit可以由IPage創建。那問題來了,IDocument由誰來創建呢?這時我們可以提供兩個全局的函數CreateDoc和DestroyDoc用來創建和銷毀IDocument的對象指針,這兩個函數是全局函數(C類型的函數),我們需要為其提供C的導出接口(這很重要)。其接口定義如下:

#pragma once#include "IDocument.h"#include "IPage.h"#include "ITextUnit.h"http://===============================================================//要導出靜態庫時,導出庫的工程和使用庫的工程都要加預編譯宏EXPORT_STATIC//要導出動態庫時,導出庫的工程要加預編譯宏EXPORT_STATIC,使用庫的工程不用//===============================================================#ifdef EXPORT //導出庫#define _API_ __declspec(dllexport)#else //導入庫#define _API_ __declspec(dllimport)#endif //EXPORT#ifdef EXPORT_STATIC //導出靜態庫#define EBAPI int#else //導出動態庫#define EBAPI extern "C" _API_ int#endif //EXPORT_STATIC//---------------------------------------------------------------//function: // CreateDoc 創建Document對象//Access:// public //Parameter:// [in] IDocument * & pDocument -//Returns:// EBAPI -//Remarks:// ...//author: luowf[/luoweifu]//---------------------------------------------------------------EBAPI CreateDoc(IDocument*& pDocument);//---------------------------------------------------------------//function: // DestroyDoc 銷毀一個Document對象//Access:// public //Parameter:// [in] IDocument * pDocument -//Returns:// EBAPI -//Remarks:// ...//author: luowf[/luoweifu]//---------------------------------------------------------------EBAPI DestroyDoc(IDocument* pDocument);

使用庫

我們可以將EBook編譯成一個靜態庫,然后再創建一個新的工程使用它。EBook工程設置:

創建一個新的工程UseEBook使用EBook庫。UseEBook工程配制:
Generation Properties/C++/Preprocess/Preprocess Definitions:EXPORT_STATIC

Generation Properties/Linker/General/Addtional Library Directories:lib庫所在路徑

Generation Properties/Linker/Input/Addtional Dependencies:EBook.lib

測試代碼:

#include "stdafx.h"#include <iostream>int _tmain(int argc, _TCHAR* argv[]){IDocument* pDoc = NULL;if(CreateDoc(pDoc) != 0){return -1;}IPage* pPage = pDoc->AddPage();ITextUnit* pTextUnit = pPage->AddTextUnit();std::cout << pTextUnit->GetId() << std::endl;DestroyDoc(pDoc);return 0;}

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
538国产精品一区二区在线| 欧美激情欧美狂野欧美精品| 精品国产欧美一区二区三区成人| 亚洲欧美另类在线观看| 国产精自产拍久久久久久| 色哟哟亚洲精品一区二区| 欧美不卡视频一区发布| 啊v视频在线一区二区三区| 国产精品久久久久久久久久久久| 国产精品va在线播放| 亚洲欧美一区二区三区四区| 红桃视频成人在线观看| 欧美专区在线播放| 亚洲欧洲美洲在线综合| 亚洲国产精品视频在线观看| 亚洲91av视频| 欧美性猛交xxxx富婆| 91精品国产成人www| 欧美专区在线视频| 日韩欧美中文字幕在线播放| 在线看国产精品| 91精品久久久久久久久久入口| 性色av一区二区三区红粉影视| 精品欧美激情精品一区| 日本在线精品视频| 久久久97精品| 欧美性69xxxx肥| 久久99青青精品免费观看| 91在线播放国产| 91欧美日韩一区| 亚洲综合精品一区二区| 亚洲国产成人在线播放| 亚洲精品国产美女| 日韩电影中文字幕在线| 91久久国产婷婷一区二区| 国产一区玩具在线观看| 欧美丰满少妇xxxx| 欧美黑人国产人伦爽爽爽| 日韩久久免费视频| 欧美一级黑人aaaaaaa做受| 九九热精品视频在线播放| 久久婷婷国产麻豆91天堂| 国产精品久久久久久久久久久久久| 亚洲国产古装精品网站| 欧美午夜xxx| 久久精品99无色码中文字幕| 中文亚洲视频在线| 欧美在线观看日本一区| 国产日韩精品视频| 国产视频综合在线| 国产欧美精品一区二区三区-老狼| 亚洲欧洲在线播放| 亚洲精品久久久久| 欧美日韩在线视频一区二区| 国内精品在线一区| 午夜精品三级视频福利| 成人亚洲综合色就1024| 欧美激情一级精品国产| 欧美精品中文字幕一区| 永久免费精品影视网站| 爽爽爽爽爽爽爽成人免费观看| 久久好看免费视频| 九九视频直播综合网| 亚洲人成五月天| 亚洲成人黄色网| 欧美福利视频网站| 欧美www在线| 岛国av在线不卡| 久热精品视频在线观看| 国产欧美在线观看| 国产精品av网站| 国产精欧美一区二区三区| 4p变态网欧美系列| 在线观看久久久久久| 久久五月天色综合| 国产精品爱久久久久久久| 亚洲天堂免费观看| 国产欧美一区二区三区在线| 久久久精品2019中文字幕神马| 久久天天躁狠狠躁夜夜躁| 精品夜色国产国偷在线| 最新亚洲国产精品| 欧美日本在线视频中文字字幕| 欧美成人黑人xx视频免费观看| 国产精品免费观看在线| 久久久久北条麻妃免费看| 亚洲精品99久久久久中文字幕| 欧美成人久久久| 久久99国产综合精品女同| 最新国产成人av网站网址麻豆| 成人久久久久久| 欧美日韩国产综合视频在线观看中文| 久热精品视频在线免费观看| 亚洲福利视频网站| 国产精品一区二区三区在线播放| 国产精品自拍偷拍视频| 欧美老女人xx| 亚洲伊人久久大香线蕉av| 91国产精品视频在线| 亚洲伊人一本大道中文字幕| 国产99久久精品一区二区 夜夜躁日日躁| 91社区国产高清| 国产精品99久久久久久www| 国产精品久久久久久久久男| 亚洲精品免费av| 欧美黑人巨大xxx极品| 欧美性xxxx极品hd满灌| 97精品国产97久久久久久| 日韩h在线观看| 97视频com| 欧美大片va欧美在线播放| 欧美激情久久久久| 欧美俄罗斯乱妇| 亚洲自拍偷拍网址| 久久久久久国产免费| 麻豆精品精华液| 色小说视频一区| 久久精品成人一区二区三区| 色综合色综合网色综合| www.欧美视频| 夜夜嗨av色综合久久久综合网| 中文字幕一区二区三区电影| 久久人91精品久久久久久不卡| 亚洲欧美日韩精品久久亚洲区| 欧美成人在线免费视频| 欧美日韩国产麻豆| 国产在线精品一区免费香蕉| 日日噜噜噜夜夜爽亚洲精品| 国产盗摄xxxx视频xxx69| 韩国国内大量揄拍精品视频| 国产精品久久久久久五月尺| 欧美中文字幕第一页| 久久天天躁狠狠躁老女人| 欧美影院久久久| 久久艳片www.17c.com| 伊人久久久久久久久久久| 日韩欧美中文第一页| 亚洲一区二区在线播放| 欧美激情性做爰免费视频| 亚洲欧美激情四射在线日| 色悠悠久久88| 亚洲美女免费精品视频在线观看| 日韩精品一区二区三区第95| 欧美一级视频在线观看| 久久福利视频网| 欧美亚洲成人网| 高清日韩电视剧大全免费播放在线观看| 2018中文字幕一区二区三区| 亚洲男人7777| 亚洲一区亚洲二区亚洲三区| 国产精品视频精品视频| 8x拔播拔播x8国产精品| 亚洲视频精品在线| 欧美日韩国产综合视频在线观看中文| 久久国产精品亚洲| 韩国视频理论视频久久| 欧美福利视频在线观看| 怡红院精品视频| 日韩免费观看在线观看| 亚洲图片欧美日产| 亚洲精品wwwww| 国产成人精品国内自产拍免费看| 曰本色欧美视频在线| 亚洲精品国产福利|