Item 29. Compilation Firewalls
Difficulty: 6
Using the Pimpl Idiom
can dramatically reduce code interdependencies and build times. But
what should go into a pimpl_ object, and what is the
safest way to use it?
In C++, when anything in a class definition
changes (even private members), all users of that class must be
recompiled. To reduce these dependencies, a common technique is to
use an opaque pointer to hide some of the implementation
details.
class X
{
public:
/* ... public members ... */
protected:
/* ... protected members? ... */
private:
/* ... private members? ... */
struct XImpl;
XImpl* pimpl_; // opaque pointer to
// forward-declared class
};
The questions for you to answer are:
-
What should go
into XImpl? There are four common disciplines.
-
Put all private data (but not functions) into
XImpl.
-
Put all private members into XImpl.
-
Put all private and protected members into
XImpl.
-
Make XImpl entirely the class that
X would have been, and write X as only the public
interface made up entirely of simple forwarding functions (a
handle/body variant).
What are the advantages/drawbacks of each? How
would you choose among them?
-
Does
XImpl require a pointer back to the X
object?
|