2013-01-24 22 views
4

我正在寫一個庫在C++中,有一個類層次結構是這樣的:C++ - 基類和私有頭

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

class Message 
{ 
}; 

請求h文件(在./mylib/include/mylib)

#include "message.h" 

class Request : public Message 
{ 
}; 

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

#include "message.h" 

class Response : public Message 
{ 
}; 

我希望我的mylib/src文件夾中的所有內容對用戶隱藏,並且只需要在mylib/include中分發文件。但是,問題與requst.h和response.h #include message.h一樣,所以當#include request.h和response.h時,用戶將得到「No such file」錯誤。有沒有辦法解決這個問題?

回答

6

你可以簡單地提供一個公共接口爲Message,並保持隱藏在實際的類:

class IMessage 
{ 
    Message* pImpl; 
}; 

分發此標題,並使用轉發聲明Message

另一種選擇是使用組合而不是繼承(你需要指針作爲成員,而不是完整的對象)。

+1

更多關於pimpl的信息:http://herbsutter.com/gotw/_100/和http://herbsutter.com/gotw/_101/ –

+0

謝謝。我會去第二個選擇。 – jpen

4

如果你想能夠使用ResponseRequest你需要包含它們聲明的頭文件。這就是爲什麼你應該把這些標題放在公開的包含文件夾中。

+0

感謝您的回覆。理想情況下,我只想分發一個頭文件(比如說「mylib.h」),並允許用戶通過#include這個頭文件使用Request和Response。這可能嗎?如果是這樣,mylib.h將包含什麼? – jpen

0

基類應該公開發布,否則你將不得不編寫序列化/反序列化機制。