A common problem that I have come across exists when attempting to create shared pointers of objects which have protected constructors. The following class design details a class that can only be accessed through a shared reference.
class A
{
protected:
A(int foo)
: _foo(foo)
{
}