Может быть и бойан, но мне такой синглет нравится больше всех,
особенно глядя вызов метода 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; } |