Figure 1: The AutoSelector class for exception-safe drawing object selection in MFC

// Saves current graphical drawing object,
// selects a new one, then restores the old
// one upon destruction.
class AutoSelector
{
public:
   AutoSelector(CDC* pDC, CGdiObject* pNew) 
   :  m_pOld( pDC->SelectObject(pNew) ),
      m_pDC( pDC )
   {
      ASSERT(m_pOld);
      ASSERT( !pNew->
         IsKindOf(RUNTIME_CLASS(CRgn)) );
   }
     
   AutoSelector(CDC* pDC, int iStockObject)
   :  m_pOld( pDC->
         SelectStockObject(iStockObject) ),
      m_pDC( pDC )
   {
      ASSERT(m_pOld);
   }
     
   ~AutoSelector()
   {
      m_pDC->SelectObject(m_pOld);
   }
     
private:
   // prevent use of (incorrect) defaults 
   AutoSelector(const AutoSelector& a); 
   AutoSelector&
   operator=(const AutoSelector& a);
     
   // prevent region selection at compile 
   // time when possible 
   AutoSelector(CDC* pDC, CRgn* pRgn);
     
   CGdiObject* m_pOld;
   CDC* m_pDC;
};