400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.

C++ Singleton (Scott Meyers)

C++ Singleton (Scott Meyers)

Příspěvekod Wlezley » 24 listopad 2011 07:11:47

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
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU

Re: C++ Scott Meyers Singleton

Příspěvekod Gelidus » 24 listopad 2011 19:08:24

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?
Gelidus
 
Příspěvky: 14
Registrován: 17 listopad 2011 11:56:47

Re: C++ Singleton template by Scott Meyers

Příspěvekod Wlezley » 24 listopad 2011 21:23:31

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.
Uživatelský avatar
Wlezley
 
Příspěvky: 316
Registrován: 24 září 2011 22:54:46
Bydliště: Plzeň
Projekt: Wlezley EU


Zpět na C/C++

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 4 návštevníků


cron