1
Vývoj / Re:Lifetime static/global/heap-allocated objektu v C++
« kdy: 01. 08. 2022, 14:17:30 »
jednoduchy priklad, ze i objekt na stacku muze byt "singleton".
sice jde vytvorit mnoho techto objektu, ale funkcni je jen ten prvni vytvoreny pomoci sid=0.
metody jsou ohnute, ze neco delaji jen kdyz je my_id objektu 0, takze jen prvni instance
funguje spravne.
---------------------------------------------------------------------------
// Singleton je na stacku
#include <iostream>
class Singleton
{
public:
Singleton(int v) : value(v) { Singleton::sid++; my_id = Singleton::sid; }
void setValue(int v) { if (my_id == 0) value=v; }
int getValue() { if (my_id > 0) return 0; return value; }
void print() { if (my_id > 0) { std::cout << "singleton is bad!" << std::endl; return; } std::cout << "singleton my_id=" << my_id << " value=" << value << std::endl; }
static int sid;
private:
int my_id;
int value;
};
int Singleton::sid = -1;
int main()
{
Singleton dobry(1);
dobry.setValue(7);
dobry.print();
Singleton spatny1(1);
spatny1.setValue(7);
spatny1.print();
Singleton spatny2(2);
spatny2.setValue(77);
spatny2.print();
dobry.setValue(17);
dobry.print();
spatny2.setValue(66);
spatny2.print();
return 0;
}
sice jde vytvorit mnoho techto objektu, ale funkcni je jen ten prvni vytvoreny pomoci sid=0.
metody jsou ohnute, ze neco delaji jen kdyz je my_id objektu 0, takze jen prvni instance
funguje spravne.
---------------------------------------------------------------------------
// Singleton je na stacku
#include <iostream>
class Singleton
{
public:
Singleton(int v) : value(v) { Singleton::sid++; my_id = Singleton::sid; }
void setValue(int v) { if (my_id == 0) value=v; }
int getValue() { if (my_id > 0) return 0; return value; }
void print() { if (my_id > 0) { std::cout << "singleton is bad!" << std::endl; return; } std::cout << "singleton my_id=" << my_id << " value=" << value << std::endl; }
static int sid;
private:
int my_id;
int value;
};
int Singleton::sid = -1;
int main()
{
Singleton dobry(1);
dobry.setValue(7);
dobry.print();
Singleton spatny1(1);
spatny1.setValue(7);
spatny1.print();
Singleton spatny2(2);
spatny2.setValue(77);
spatny2.print();
dobry.setValue(17);
dobry.print();
spatny2.setValue(66);
spatny2.print();
return 0;
}