Listing 1

// SimpleErrorLogger.h, cpp
//----------------------------------------------------------
class ErrorLogger
{
public:
  typedef boost::shared_ptr<ErrorLogger> ErrorLoggerPtr;

  virtual  ~ErrorLogger();
  static   ErrorLoggerPtr Instance();
  virtual  void Error( const string& msg );
  virtual  void Log( const string& msg );

  static   void PushLogger( ErrorLoggerPtr );
  static   void PopLogger();
protected:
  ErrorLogger() {}
private:
  static stack<ErrorLoggerPtr> loggers_;
};
//----------------------------------------------------------
// SimpleErrorLogger.cpp
stack<ErrorLoggerPtr> ErrorLogger::loggers_;

//----------------------------------------------------------
ErrorLogger::~ErrorLogger()
{
}
//----------------------------------------------------------
ErrorLoggerPtr ErrorLogger::Instance( )
{
  if( loggers_.empty() )
    PushLogger(ErrorLoggerPtr(new ErrorLogger));
  return loggers_.top();
}
//----------------------------------------------------------
void ErrorLogger::Error( const string& msg ) 
{
  cerr << msg;
}
//----------------------------------------------------------
void ErrorLogger::Log( const string& msg ) 
{
  cout << msg;
}
//----------------------------------------------------------
void ErrorLogger:: PushLogger( ErrorLoggerPtr pLogger )
{
  loggers_.push(pLogger);
}
//----------------------------------------------------------
void ErrorLogger:: PopLogger()
{
  if( !loggers_.empty() )
    loggers_.pop();
}