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