2013-01-24 48 views
1

我的./mylib/src目錄中有以下文件。我希望此位置的任何內容都可以隱藏起來。C++ - 導出C++庫的公共部分的正確方法

message.h文件(在./mylib/src)

// Include guard 
namespace MyLib 
{ 
    class Message 
    { 
    public: 
     Message(); 
     virtual ~Message() = 0; 

     virtual bool ToString(std::string& rstrOutput); 
     bool IsEmpty() const; 

    protected: 
     void DoStuff(); 

    private: 
     Message(const Message&); // Disable 
     Message& operator=(const Message&); // Disable 

    private: 
     int m_nData; 
    }; 
} 

request.h文件(在./mylib/src)

// Include guard 
#include "message.h" 

namespace MyLib 
{ 
    class Request : public Message 
    { 
    public: 
     Request(); 
     ~Request(); 

     bool ToString(std::string& rstrOutput); 

    private: 
     bool Build(); 

    private: 
     bool m_b; 
    }; 
} 

response.h文件(在./mylib/src中)

// Include guard 
#include "message.h" 

namespace MyLib 
{ 
    class Response : public Message 
    { 
    public: 
     Response(); 
     ~Response(); 

     std::string GetSomething() const; 
    }; 
} 

當我分發我的庫時,我想讓用戶只包含一個頭文件(比如./mylib/include/mylib/mylib.h)並使用Request和Response。所以,我創建了一個大的頭文件是這樣的:

mylib.h文件(./mylib/include/mylib)

// Include guard 
#include <string> 

namespace MyLib 
{ 
    class Message 
    { 
    public: 
     Message(); 
     virtual ~Message() = 0; 

     virtual bool ToString(std::string& rstrOutput); 
     bool IsEmpty() const; 
    }; 

    class Request : public Message 
    { 
    public: 
     Request(); 
     ~Request(); 

     bool ToString(std::string& rstrOutput); 
    }; 

    class Response : public Message 
    { 
    public: 
     Response(); 
     ~Response(); 

     std::string GetSomething() const; 
    }; 
} 

#endif 

但問題是,當我更改每次我的圖書館的公共部分或添加新的類,我將不得不更新mylib.h文件,這是不方便的。什麼是更好的方式來實現相同的事情?

+0

提供包含所有其他標頭的頭文件。那麼,我的意思是包含像'#include ':P –

+0

編譯器?平臺?請提及 – Ajay

+0

兩個平臺:Windows(VC2010)和Linux(Eclipse CDT + Cygwin GCC) – jpen

回答

2

我會從「/ src」中刪除三個單獨的頭文件,並在我的實現文件(駐留在「/ src」)中使用「/ include」中的一個公共頭文件。在編譯期間,您只需正確設置包含路徑即可完成該工作。

+0

我的mylib.h文件只包含公共內容。所以如果我刪除了我的message.h,request.h和response.h,我會在哪裏定義說布爾Request :: Build()? – jpen

+0

您可以在文件「./mylib/src/request.cpp」中定義它。 –

+0

但後來我得到「/src/request.cpp:21:14:錯誤:'生成'未在此範圍內聲明」錯誤。 – jpen

0

您可以使它成爲lib或dll,並且用戶只會調用公共API,如果您想爲用戶提供標頭,則可以要求用戶包含/ exportFolder中的所有內容。或者如之前的評論所述。或者就像你做的那樣,大頭球就足夠了。除非某些相關類更改,否則不會對其進行修改。這是正常的。