// x.h: original header
//
#include <iostream> // remove, unnecessary
#include <ostream> // std, typedef. it can replace with #include <iosfwd>
#include <iosfwd> // for compatibility.
#include <list>
// None of A, B, C, D or E are templates.
// Only A and C have virtual functions.
#include "a.h" // class A
//#include "b.h" // class B
class B;
//#include "c.h" // class C
class C;
//#include "d.h" // class D
// never #include a header when just being mentioned as a parameter and as a return type.
//#include "e.h" // replace with
class E
class X : public A, private B // determine X's object size, virtual functions, and other fundamentals.
{
public:
X(const C&);
B f( int, char* );
C f( int, C );
C& g( B );
E h( E );
virtual std::ostream& print( std::ostream& ) const;
private:
// std::list<C> clist_; // need C's define
// D d_;
struct Ximpl; // include B
XImpl* pimpl_;
};
inline std::ostream& operator<<( std::ostream& os, const X& x )
{
return x.print(os);
}
// Implementation file x.cpp
//
struct X::XImpl
{
std::list<C> clist_;
D d_;
};
// file x.h
class X
{
// public and protected members
private:
struct XImpl;
XImpl* pimpl_;
// a pointer to a forward-declared class
};
// file x.cpp
struct X::XImpl
{
// private members; fully hidden, can be
// changed at will without recompiling clients
};
Minimizing Compile-time Dependencies 1
最新推荐文章于 2020-05-27 19:22:08 发布