2015-05-09 66 views
0

我有在頭文件和一個類的接口及其在一個單獨的源文件執行此代碼:隱藏類實現

第一:頭文件「Gradebook.h」

#include <string> 

using namespace std; 

class Gradebook{ 
public: 
    Gradebook(string); 
    void setCoursename(string); 
    string getCoursename(); 
    void displayMessage(); 
private: 
    string nameofCourse; 
}; 

第二:「Gradebook.cpp」

#include "stdafx.h" 
#include "Gradebook.h" 
#include <iostream> 

using namespace std; 

Gradebook::Gradebook(string name){ 
    setCoursename(name); 
} 
void Gradebook::setCoursename(string name){ 
    nameofCourse = name; 
} 
string Gradebook::getCoursename(){ 
    return nameofCourse; 
} 
void Gradebook::displayMessage(){ 
    cout << "Display message function shows :" << getCoursename() << endl; 
} 

實現我如何能以僅在其他項目中使用「Gradebook.h」,並隱藏我的實現鏈接來回這兩個單獨的文件客戶程序員?

+0

您可以將實現預編譯爲靜態或動態加載庫。 –

+0

關閉VS項目中的預編譯頭文件,以便能夠刪除'stdafx.h'廢話。 –

+1

將.cpp編譯爲一個dll,使用「pimpl idiom」隱藏數據成員和私有方法。 –

回答

2

有幾個答案。這將有助於瞭解你爲什麼要隱藏實現。這就是你可能想要這樣做的原因,我可以想到。

  1. 保護商業祕密:算了。爲了能夠執行你的代碼,計算機必須能夠運行它。實際上,通過將代碼編譯爲靜態庫,可以刪除註釋,方法名稱和變量名稱,甚至可以在其上運行混淆器來隱藏控制流(以增加不必要的跳轉爲代價來減慢它的代價),但最終該代碼(或從其生成的機器代碼)具有以保持可讀性或者不能被執行。

  2. 使用戶更容易使用你的代碼:如果您有多個源文件,並可能會增加更多的文件,並希望您的客戶只是能夠在一個文件中去取所有最新的更改,而不必添加單個源文件,將其編譯爲靜態或動態庫。然後你可以把圖書館和標題交給他人,他們可以使用它們。

    您還可以創建包含所有其他標題的「傘頭」。這樣,客戶端可以簡單地將文件夾的includes文件夾的路徑添加到其編譯器調用/項目文件中,幷包含一個標題,其中包含所有其他標題。如果您添加或拆分標題,則只需更改標題以包含新標題和所有使用它的項目繼續工作。

    請注意,使用庫會限制您的客戶端:他們無法輕鬆地在調試器中遍歷代碼,他們無法輕鬆修復和編譯內容。如果他們需要您的代碼在新平臺上運行,或者想要在編譯器中使用不同的優化設置,則他們不能重新編譯它。

    另一方面,如果你打算出售你的圖書館,你可能想要堅持你的來源。如果客戶沒有了源代碼,不關心代碼的安全性的話,他們可以獲得更便宜的版本,如果他們想讓其購買任何其他功能,則可以額外收取費用一個版本爲編碼爲他們的新平臺等意外依靠實施細則

  3. 阻止客戶端:你並不真正需要做的,除了你的代碼分成公衆的事和私人文件。通常你的實現文件是私有的,你的頭文件是公開的,但是你可能有一些內部類的私有頭文件。

    由於C++不允許定義和其它語言一樣做支持類別類擴展未在頭的類聲明中聲明實例變量或方法,你可能不得不求助於私有實現 (又名'pimpl')模式。

    這通常意味着您聲明瞭一個定義公共API的類,該API只是將指針包裝爲包含真實實現並實際調用的實際類的指針。它通常只有一個實例變量,pimpl,它是指向另一個類的指針。您只需使用class Foo;前向聲明私有類,因此您的客戶的代碼不知道私有類的任何內容(除非他們明確地查看實現文件或私有頭文件,例如,修復錯誤時)。

  4. 創建一個單一的文件類我提到這最後的,因爲它一般是做一個愚蠢的事情,但只是在理論上,你也可以移動實現文件的內容到標題。然後客戶端只需要包含頭文件並獲取所有的源代碼。然而,這有很多不利之處,例如使代碼難以閱讀,減慢編譯時間,並要求客戶端處理由於包含來自幾個.cpp文件的文件而導致的類的重複定義。簡而言之:不要這樣做。

+0

非常感謝您的幫助 – Moutasem