Malinovski
Может быть и бойан, но мне такой синглет нравится больше всех,
особенно глядя вызов метода Singlet().GetValue().
Недостаткиом такого вызова является:
1. Выделяется память под временный объект в стеке.
2. вызываются конструктор и деструктор.

#include <iostream>

using namespace std;

class Singlet {

public:
Singlet() {
cout << "Singlet()" << endl;

}

~Singlet() {
cout << "~Singlet()" << endl;

}

Singlet(const Singlet& object) {}

Singlet& operator=(const Singlet & object) {}

void SetValue(int Value) {
m_Singlet.m_Value = Value;

}

int GetValue(void) {
return m_Singlet.m_Value;

}

void * operator new(size_t count) {

return &m_Singlet;
}

void operator delete(void * object) {

if (object != &m_Singlet) {
delete object;

}
}

private:
static Singlet m_Singlet;
int m_Value;

};
Singlet Singlet::m_Singlet;

int main(int argc, char *argv[]) {

// создаём объект динамически
Singlet * Obj1 = new Singlet();

Obj1->SetValue(10);
cout << Obj1->GetValue() << endl; // устанавливаем значение

// создаём объект динамически
Singlet * Obj2 = new Singlet;
cout << Obj2->GetValue() << endl;

// создаём объект статически
Singlet Obj3;
cout << Obj3.GetValue() << endl;

// создаём объект статически
cout << Singlet().GetValue() << endl;;

return 0;
}

@темы: Трюки программирования