Stránka 1 z 1

C++ Singleton (Scott Meyers)

PříspěvekNapsal: 24 listopad 2011 07:11:47
od Wlezley
Je na čase se podělit o další důležitou věc. Dalo by se říct, že singletony patří do takových pokročilejších základů programování. Ale názor si utvořte sami.

Je tomu již několik měsíců, co jsem studoval singletony, protože jsem je potřeboval do aplikace pro 3 základní funkce programu. Měl jsem 3 třídy pro zobrazení, čtení z klávesnice a zápis do logu (na HDD). Tyto třídy jsem potřeboval využívat prakticky za chodu celého programu. Problém objektů je ale ten, že se musí kontruovat, pak voláte metody a na konci dojde k destrukci. To třeba u logu nepřipadá v úvahu, vzhledem k faktu, že nová konstrukce mi vytvářela nový soubor (přepsala starý log, vytvořený jinou funkcí).. ..a když se funkce(metody) překrývaly (z jedné se volala další), tak docházelo k pádům aplikace kvůli konfliktům na úložišti, atd.

Řešením byl singleton. Ale byl to problém. Těch implementací je několik a některé jsou složitější než se může na první pohled zdát. A teď se dostáváme k jádru věci. Narazil jsem na implementaci singletonu Scotta Mayerse, která je (dle mého názoru) geniální. Posuďte sami (všeobecný příklad):
Kód: Vybrat vše
class Singleton
{
public:
    static Singleton &instance()
    {
        static Singleton inst; // 2. inicializace statického objektu - pouze při prvním průchodu - registrace atexit
        return inst; // 4. návrat zkonstruovaného objektu
    }

private:
    Singleton() { } // 3. konstruktor objektu
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
    ~Singleton() { } // 6. destruktor objektu
};

int main(int argc, char** argv)
{
    Singleton& s = Singleton::instance(); // 1. zavolá se metoda
} // 5. konec programu - destrukce statických proměnných


V praxi to může vypadat například takto (můj program):
http://paste.wlezley.eu/index.php/view/42930715
http://paste.wlezley.eu/index.php/view/36455688
http://paste.wlezley.eu/index.php/view/50019155
Ty definice pod každou z těchto tříd (sCon, sLog, sKey) slouží pouze ke zkrácení zápisu v samotném programu.

Nevíte jak singletony fungují ani co to je? Doporučuji:
(CZ) http://cs.wikipedia.org/wiki/Singleton
(EN) http://en.wikipedia.org/wiki/Singleton_pattern

Re: C++ Scott Meyers Singleton

PříspěvekNapsal: 24 listopad 2011 19:08:24
od Gelidus
Asi sa mýlim, ale nestačilo by za takúto triedu pridať :

Kód: Vybrat vše
static ClassMgr *cmgr;


aj s triedou by to vyzeralo asi takto :

Kód: Vybrat vše
class ClassMgr
{
};
static ClassMgr *cmgr;


ak teda fungujú static tak, že sa na začiatku vytvoria a na konci sa zavolajú destructory, myslím že práve toto by malo vytvoriť objekt s ktorým je možno manipulovať v celom programe (kam sa includne header). Alebo má singleton ešte niečo viac?

Re: C++ Singleton template by Scott Meyers

PříspěvekNapsal: 24 listopad 2011 21:23:31
od Wlezley
Ne, to by tedy nestačilo. ;) Ty jsi z toho v podstatě udělal globální promennou. Smysl singletonu spočívá v zajištění běhu POUZE jedné instance třídy.