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);
}