最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)“隱藏實現(xiàn),開放接口”的方案

 更新時間:2015年07月24日 14:37:18   作者:luoweifu  
本文從一個實例講解了C++實現(xiàn)“隱藏實現(xiàn),開放接口”的方案,文章條理清新,內(nèi)容充實,需要的朋友可以參考下

為什么要有接口?

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

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

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

從一個實例講講實現(xiàn)方案

需要

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

圖1 :類的關(guān)系圖 

設(shè)計

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

圖2: 工程目錄結(jié)構(gòu)

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

代碼實現(xiàn)

IDocument.h:

#pragma once

class IPage;

class IDocument
{
public:
virtual ~IDocument(void){}

public:

//---------------------------------------------------------------
//function: 
// GenerateId 生成本文檔內(nèi)唯一的文本對象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 once

class 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 once

class ITextUnit
{
public:
~ITextUnit(void){}

public:
//---------------------------------------------------------------
//function: 
// GetId 獲得ID
//Access:
// virtual public 
//Parameter:
//Returns:
// int - 返回ID
//Remarks:
// ...
//author: luoweifu
//---------------------------------------------------------------
virtual int GetId() = 0;

//---------------------------------------------------------------
//function: 
// SetId 設(shè)置ID
//Access:
// virtual public 
//Parameter:
// [in] int id - 要設(shè)置的ID
//Returns:
// void - 
//Remarks:
// ...
//author: luoweifu
//---------------------------------------------------------------
virtual void SetId(int id) = 0;

};

提供C接口

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

#pragma once

#include "IDocument.h"
#include "IPage.h"
#include "ITextUnit.h"


//===============================================================
//要導出靜態(tài)庫時,導出庫的工程和使用庫的工程都要加預編譯宏EXPORT_STATIC
//要導出動態(tài)庫時,導出庫的工程要加預編譯宏EXPORT_STATIC,使用庫的工程不用
//===============================================================
#ifdef EXPORT //導出庫
#define _API_ __declspec(dllexport)
#else //導入庫
#define _API_ __declspec(dllimport)
#endif //EXPORT


#ifdef EXPORT_STATIC //導出靜態(tài)庫
#define EBAPI int
#else //導出動態(tài)庫
#define EBAPI extern "C" _API_ int
#endif //EXPORT_STATIC


//---------------------------------------------------------------
//function: 
// CreateDoc 創(chuàng)建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編譯成一個靜態(tài)庫,然后再創(chuàng)建一個新的工程使用它。EBook工程設(shè)置:

創(chuàng)建一個新的工程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;
}

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

相關(guān)文章

  • C++實現(xiàn)連連看消除算法

    C++實現(xiàn)連連看消除算法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)連連看消除算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語言職工管理系統(tǒng)設(shè)計

    C語言職工管理系統(tǒng)設(shè)計

    這篇文章主要為大家分享了一份C語言職工管理系統(tǒng)設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • c++與c中的數(shù)組初始化默認值如何為0

    c++與c中的數(shù)組初始化默認值如何為0

    這篇文章主要介紹了c++與c中的數(shù)組初始化默認值如何為0問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++實現(xiàn)八個常用的排序算法 插入排序、冒泡排序、選擇排序、希爾排序等

    C++實現(xiàn)八個常用的排序算法 插入排序、冒泡排序、選擇排序、希爾排序等

    這篇文章主要介紹了C++如何實現(xiàn)八個常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序 、快速排序、歸并排序、堆排序和LST基數(shù)排序,需要的朋友可以參考下
    2015-07-07
  • Qt項目實戰(zhàn)之方塊游戲的實現(xiàn)

    Qt項目實戰(zhàn)之方塊游戲的實現(xiàn)

    這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)簡易的方塊游戲,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • 如何將C++源程序改寫為C語言

    如何將C++源程序改寫為C語言

    C++中主要的與C的區(qū)別最大而且最常用的特性及修改方法,接下來我們一起來學習他們吧
    2021-08-08
  • C++進程鏈接工具之通信器詳解

    C++進程鏈接工具之通信器詳解

    本文主要介紹了C++通信器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-11-11
  • 詳解C++?OpenCV實現(xiàn)圖像拼接的原理及方法

    詳解C++?OpenCV實現(xiàn)圖像拼接的原理及方法

    本文以實現(xiàn)圖像拼接為目標,把分割開的圖像進行拼接還原,核心的內(nèi)容包括:OpenCV圖像拼接相關(guān)原理以及OpenCV圖像拼接案例的實現(xiàn),感興趣的可以了解一下
    2022-07-07
  • C++使用map容器實現(xiàn)電子詞典

    C++使用map容器實現(xiàn)電子詞典

    這篇文章主要為大家詳細介紹了C++如何使用map容器實現(xiàn)電子詞典功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的小伙伴可以參考一下
    2022-11-11
  • C語言實現(xiàn)計算器的兩種方法

    C語言實現(xiàn)計算器的兩種方法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)計算器的兩種方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

观塘区| 古交市| 奉节县| 泰顺县| 景东| 江油市| 泰和县| 临城县| 湛江市| 新和县| 绥化市| 洪湖市| 中西区| 鄄城县| 时尚| 乌兰浩特市| 冀州市| 鹤岗市| 竹溪县| 建水县| 莫力| 宜城市| 泸水县| 遵化市| 常州市| 界首市| 泗水县| 衡山县| 德安县| 湖北省| 五大连池市| 凤山县| 三明市| 翁牛特旗| 永和县| 高阳县| 噶尔县| 怀集县| 海林市| 洪洞县| 蓝田县|