1. 程式人生 > >《Effective c++ 》 介面與實現分離 檔案間的編譯依存關係降至最低

《Effective c++ 》 介面與實現分離 檔案間的編譯依存關係降至最低

參考Effective c++中的條款31 將檔案間的編譯依存關係降至最低 。

Person.h

class Date;                                 // 類的前置宣告
class Address;
class Person
{
public:
    virtual ~Person();
    virtual std::string name() const = 0;      // 純虛擬函式(派生類必須要實現自己的方法)
    virtual std::string brthDate() const = 0;
    virtual std::string
address() const = 0; /*返回一個tr1::shared_ptr, 指向一個新的Person, 並一給定之引數初始化 */ static std::tr1::shared_ptr<Person> create(const std::string& name, const Date& birthday, const Address& addr); // 有了RealPerson(看下面) 之後,寫出Person::create() }

然後再字以int main 為例:

// 建立一個物件,支援Person介面
#include "Person.h" ...... int main(){ std::tr1::shared_ptr<person> pp(Person::create(name, dateofBirth, address)); ...... // 我們可以這樣使用它 ...... std::cout << pp->name() << " was born on " << pp->birthDate() << " and now live as " << pp->
address(); ...... }

支援interface class 介面的那個具象類(concrete class)必須被定義出來,而且真正的建構函式必須被呼叫。一切都在virtual建構函式實現碼所在的檔案內祕密發生。假如interface class person 有個具象的 derived class RealPerson . 則這一切都在 RealPerson 裡面實現繼承而來的virtual 函式的實現。

RealPerson.h

#include "Person.h"
class RealPerson: public Person{
public:
    RealPerson(const std::string& name, const Date& birthday, const Address& addr)
    : theName(name)
    , theBirthDate(birthday)
    , theAddress(addr)
    {}
    virtual ~RealPerson(){}
    std::string name() const;
    std::string birthDate() const;
    std::string address() const;
private:
    std::string theName;
    Date theBirthDate;
    Address theAddress;
}
RealPerson.cpp 然後自己實現!!!!

Person.cpp 有了RealPerson之後,寫出Person::create()

#include "RealPerson.h"
#include "Person.h"
std::tr1::shared_ptr<Person> Person::create(const std::string& name,
            const Date& birthday, const Address& addr)
{
    return std::tr1::shared_ptr<Person>(new RealPerson(name, birthday, addr));
}

這樣我們就可以只給使用者Person.h 檔案,Person.cpp 和 RealPerson.cpp 和 RealPerson.h 可以不用給使用者。

Person.cpp 和 RealPerson.cpp 和 RealPerson.h 生成的 lib 檔案給使用者,使用者即可以使用。

編譯器在編譯的時候會把 Person.h 裡面的介面具體實現從 lib 檔案中新增到程式中。
這塊具體的可以去自行搜尋相關編譯流程 c++ 裡的 .h 和 .cpp 之間的編譯關係及 .lib 。

相關推薦

Effective c++ 》 介面實現分離 檔案編譯依存關係最低

參考Effective c++中的條款31 將檔案間的編譯依存關係降至最低 。 Person.h class Date; // 類的前置宣告 class Address; class Perso

Effective C++》:條款31:將檔案編譯依存關係最低

假如你在修改程式,只是修改了某個class的介面的實現,而且修改的是private部分。之後,你編譯時,發現好多檔案都被重新編譯了。這種問題的發生,在於沒有把“將介面從實現中分離”。Class的定義不只是詳細敘述class介面,還包括許多實現細目:

檔案編譯依存關係最低

2016年3月22日 第四周 星期二 陰 《EFFECTIVE C++》 第140頁 條款31:將檔案間的編譯依存關係降至最低。 C++並沒有把“將介面從實現中分離”這事做得很好。 編譯依存關係:compilation dependency。 連串編譯依存關係:cascadi

介面實現分離

也許,你聽過設計模式裡的箴言,要針對介面程式設計,而不應該針對細節(具體)程式設計;或者你還聽過,要減少程式碼間的依賴關係;甚至你還知道,修改一個模組時,要保證重新編譯的檔案依賴要最小化,而重新編譯的時間最短化。當你問,How to?大神就會祭出嗯,你應該將介面與實現分離的經文。 我們在使用面嚮物件語言程式

Effective C++》條款34: 將檔案編譯依賴性最低

假設某一天你開啟自己的C++程式程式碼,然後對某個類的實現做了小小的改動。提醒你,改動的不是介面,而是類的實現,也就是說,只是細節部分。然後你準備重新生成程式,心想,編譯和連結應該只會花幾秒種。畢竟,只是改動了一個類嘛!於是你點選了一下"Rebuild",或輸入make(或其

C語言介面實現[+]

static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/text.doc,v 1.10 1996/06/26 23:02:01 drh Exp $"; #include <string.h> #include <limits.h> #

讀書筆記--C語言介面實現--介面實現

介面實現 重點內容在本書中的第二章中,介紹了介面的封裝例子。 1. 介面定義 C語言中可將介面封裝好,讓後以.h檔案作文擴充套件,簡單例子: extern int Arith_max(int x, int y); extern int Ari

利用瀏覽器實現程式介面實現分離

關鍵字 WebBrowser,IDocHostUIHandler,GetExternal 1 引言在用Delphi、Visual Basic等視覺化快速開發工具編寫Windows應用程式時,常會遇到這樣幾個問題:1) 希望程式介面美觀。在Delphi中,開發人員通常使用各種控

c語言介面實現--再論記憶體管理含例項

本章開頭指出上一章節描述的記憶體管理方法存在一些缺陷,比如不適合頻繁建立和銷燬記憶體的應用場景;所以在本章重新給出了另外一種設計思路。提出了記憶體池的概念,如果熟悉的小夥伴,還接觸過執行緒池的概念。個人認為這一章節比前一章節更好理解。 本書中的程式碼有個地方的

C語言介面實現

1. 模組化程式設計        面向物件程式設計是一種思想,和語言無關。學過C++、java等面向物件程式語言的同學,應該都知道面向物件的三大特性是封裝、繼承和多型。而C語言一直被蒙上了面向過程程式設計的面紗。工作後從事的是嵌入式軟體開發,在開發過程中運用最多的還是C語

[C++]模板類的宣告實現分離問題

本文,記錄C++模板類的實現。 實驗環境: linuxg++c++98 模板類的宣告與實現分離錯誤 目的:實現一個bag類 做法:模板類bag的宣告與實現分離,也就是.cpp和.h檔案分離 此

關於C++中介面實現的理解

        所謂介面繼承,就是派生類只繼承函式的介面,也就是宣告;而實現繼承,就是派生類同時繼承函式的介面和實現。       我們都很清楚C++中有幾個基本的概念,虛擬函式、純虛擬函式、非虛擬函式。       虛擬函式:       C++實現執行中的多型性是通過

C語言介面實現》實驗——格式化(Fmt_T)

實驗程式是用vc6編譯,一定注意副檔名為c,不是cpp,下載前面幾個測試程式(連結串列、表、原子中有下載連結)中直接將下面源程式覆蓋1.c的內容即可! 再次強烈建議在這些函式上設上斷點,按F11跟進去把原始碼走一遍,才有真正的學習效果! 源程式如下: #inc

(四)我的第二個GUI程式,實現Python程式的介面邏輯分離

1. 在Pycharm中,新建專案SecondGUI。2. 呼叫Qt設計師(Designer.exe),新設計一個視窗的ui檔案(myComboBox.ui)3.  呼叫PyUIC5,將myComboBox.ui檔案轉為myComboBox.py檔案。4. 新建my_Comb

使用 c++ 模板顯示例項化解決模板函式宣告實現分離的問題

問題背景 開始正文之前,做一些背景鋪墊,方便讀者瞭解我的工程需求。我的專案是一個客戶端訊息分發中心,在連線上訊息後臺後,後臺會不定時的給我推送一些訊息,我再將它們轉發給本機的其它桌面產品去做顯示。後臺為了保證訊息一定可以推到客戶端,它採取了一種重複推送的策略,也就是說,每次當我重新連線上後臺時,後臺會把一段時

設計實現分離——面向接口編程(OO博客第三彈)

none @override flag ava 三種 time rri 初學 fault 如果說繼承是面向對象程序設計中承前啟後的特質,那麽接口就是海納百川的體現了。它們都是對數據和行為的抽象,都是對性質和關系的概括。只不過前者是縱向角度,而後者是橫向角度罷了

集合的接口實現分離

circular 形式 lin 循環數組 才有 循環 有意義 new 表示 1.隊列接口的最簡形式如下: public interface Queue<E> { void add(E element); E remove(); int size(); } 2.這

第六章 介面實現

一、介面 介面是一種資料型別,使用關鍵字interface定義,包含介面宣告和介面體。 interface Printable { }   介面體中包含常量的宣告(沒有變數)和抽象方法兩部分。 介面體中所有常量的訪問許可權都是public,而且都是stati

201711671223《Java程式設計》第七週學習總結 第6章介面實現

201711671223《Java程式設計》第七週學習總結 第6章介面與實現 教材內容學習總結 使用關鍵字interface在介面名字前定義一個介面,介面體中只有抽象方法,沒有變數和普通方法,無論常量還是方法一定都是public,且常量是static常量。介面有類來實現以便使用介面中的方法,

2.4 面向物件4:介面實現

@介面與實現 介面定義了一組共性 這些共性體現為介面的抽象方法 抽象方法就是隻有方法定義,沒有方法實現的方法 接口裡有且只有抽象方法 介面可以有多種不同的具體子類實現 介面的作用是為子類實現提供統一的API