I am writing a class
In the class, I use boost::graph::adjacent_list as a private member.
but I don't want my header file inc开发者_StackOverflow社区lude boost header file, because any other file include my header file will need to include boost header file.
Is there a way can avoid include boost header file in my own header file.
I have tried forward declaration, but fails.
You can't do this directly, but you can probably solve the underlying problem of not propagating an implementation detail (boost) by pimpl
ing your class. This essentially means that you forward declare a pointer to your implementation details, which are then fully implemented just in a source file.
If your header file is definition only, and is fully implemented in a cpp file (i.e. the header file doesn't do anything with boost::graph::adjacent_list
then in your header, you can
- Forward declare a
bgalWrapper
struct. - Have a pointer to that struct instead of
boost::graph::adjacent_list
- In the CPP file that implements the header file, declare the new
bgalWrapper
struct (which only has aboost::graph::adjacent_list
member) - Create an instance of the struct in the classes ctor (and - obviously
- clean up in the dtor).
Now each class can have a reference to the boost item without the header needing to know about boost.
There's probably a name (and wikipage) for this pattern, but it's years since I programmed C++ seriously.
Hope this helps.
Update What I've described is a partial implementation of the PIMPL Idiom
Thanks Mark B
I didn't test it, but can't you define the list as a pointer variable? Then the forward declaration should succeed. You'll have to nest the namespaces though:
using namespace boost::graph;
class adjacent_list;
class MyClass {
private adjacent_list<foo, bar> m_list;
}
Or perhaps:
namespace boost {
namespace graph {
class adjacent_list;
}
}
class MyClass {
private adjacent_list<foo, bar> m_list;
}
Then in your implementation file, just use it as a pointer:
#include <boost/graph/adj_list_serialize.hpp>
MyClass::MyClass() {
m_list = new adjacency_list<foo, bar>();
}
精彩评论