2013-01-24 19 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

基类应该公开发布,否则你将不得不编写序列化/反序列化机制。