Singleton (mit Referenz)

Der Copy-Konstruktor und der Zuweisungsoperator müssen nicht implementiert werden. Der Konstruktor wird beim allerersten Aufruf von getInstance() aufgerufen. Der Destruktor wird erst bei Programmende aufgerufen.

Deklaration:

class Singleton
{
   private:
      Singleton();
      Singleton(const Singleton& source);
      Singleton& operator=(const Singleton& source);

   public:
      virtual ~Singleton();
      static Singleton& getInstance();
};

Implementierung:

Singleton::Singleton()
{
}

Singleton::~Singleton()
{
}

Singleton& Singleton::getInstance()
{
   static Singleton instance;
   return instance;
}

va_arg, variable Argumente (...)

Beispiel zur Verwendung von variablen Funktionsargumenten, die erst zur Laufzeit des Programms festgelegt werden.

Deklaration:

class Class
{
   private:
      void trace(const char* format, va_list argumentlist);

   public:
      void trace(const char* format, ...);
};

Implementierung:

#include <stdio.h>
#include <stdarg.h>
#include "class.h" // header file of class "CClass"

void Class::trace(const char* format, va_list argumentlist)
{
   // allocate and initialize the buffer.
   const unsigned long BUFFERLENGTH = 512;
   char buffer[BUFFERLENGTH];
   ::memset(buffer, 0, BUFFERLENGTH * sizeof(char));

   // assemble the passed argument list into the buffer.
   ::_vsnprintf(buffer, BUFFERLENGTH - 1, format, argumentlist);

   // get the (zero based) index of the buffer's last character.
   int lastCharacterIndex = strlen(buffer) - 1;
   if ((BUFFERLENGTH - 1) <= lastCharacterIndex)
   {
      // two characters less to save the terminating null character.
      lastCharacterIndex = BUFFERLENGTH - 2;
   }

   // make sure the last character is a CR/LF.
   if (buffer[lastCharacterIndex] != '\n')
   {
      buffer[lastCharacterIndex + 1] = '\n';
   }

   // print out the buffer to standard out.
   cout << buffer;
}

void Class::trace(const char* format, ...)
{
   va_list argumentlist;
   va_start(argumentlist, format);

   // call the internal "trace" method.
   trace(format, argumentlist);

   va_end(argumentlist);
}