|
[ netoff @ 06.04.2005. 17:23 ] @
| Da li ovo može da bude singleton?
Code:
"singleton.h"
template <class T>
class singleton
{
public:
singleton();
~singleton();
T* operator->(){ return _instance;};
private:
static T* _instance;
static int _c;
};
"singleton.spp"
template <class T> T* singleton<T>::_instance = 0;
template <class T> int singleton<T>::_c = 0;
template <class T>
singleton::singleton()
{
if (!_instance)
_instance = new T();
++_c;
}
template <class T>
singleton::~singleton()
{
--_c;
if (!_c)
delete _instance;
}
Izgleda mi suviše prosto da bi radilo. Mora da sam nešto prevideo?
|
[ ivbrcic @ 07.04.2005. 09:07 ] @
Nije stvar u jednostavnosti ili slozenosti, nego smisao singleton-a.
Ovo sto si ti napravio, to nije SINGLETON!
Naime ideja singleton-a je da ga nitko ne moze kreirati, on je jedan jedini za sve.
Svi mu mogu pristupati preko njegove public funkcije.
Kako ces onemoguciti korisnika da na svoju ruku kreira vise objekata?
Tako sto ce ti kostruktor biti ili privatan ili protected.
Evo rjesenja.
Sa ovim rjesenjem nemas problema sa oslobađanjem memorije, objekt postoji prije i nakon main-a.
// Singleton.h
Code:
#ifndef SINGLETON_H__
#define SINGLETON_H__
class Singleton {
public:
static Singleton* Instance();
void Work () const;
protected:
Singleton();
private:
static Singleton _instance;
};
#endif // SINGLETON_H__
// Singleton.cpp
Code:
#include <iostream>
#include "Singleton.h"
Singleton Singleton::_instance;
Singleton::Singleton ()
{
}
void Singleton::Work () const
{
std::cout << "Singleton" << std::endl;
}
Singleton * Singleton::Instance ()
{
return &_instance;
}
// main.cpp
Code:
#include <iostream>
#include "Singleton.h"
int main ()
{
Singleton *sng = Singleton::Instance(); // OK
sng->Work(); // OK
Singleton sng; // compiler ERROR -> NOK
Singleton *sng = new Singleton; // compiler ERROR -> NOK
}
[ dragansm @ 07.04.2005. 09:59 ] @
Code:
template< class T >
class Singleton
{
public:
static T *GetInst()
{
static T* inst = new T();
return inst;
}
protected:
Singleton() {}
}
class Dummy : public Singleton<Dummy>
{
friend Singleton<Dummy>;
....
private:
Dummy();
}
Dummy *d = Dummy::GetInst();
d->Use...
delete d;
[ netoff @ 07.04.2005. 10:29 ] @
Da poznata su mi ta rešenja sa GetInstance...() i privatnim konstruktorom. Ali ono sto mene interesuje, da li je moguce singleton izvesti bez korisćenja takve GetInstance() sintakse. U tom smislu, zašto moje rešenje ne predstavlja singleton i zasto ono neće raditi??
[ dragansm @ 07.04.2005. 12:17 ] @
da bi se pozvalo
Code:
_instance = new T();
ctr klase T mora biti public. Zbog toga mozes da napises:
Code:
T *t1 = new T(); // 1. instanca
T *t2 = new T(); // 2. instanca
singleton<T> tt1; // 3. instanca
singleton<T> tt2; // 3. instanca
bez koriscenja singletona. Sustina singletona je da imas samo jednu instancu klase.
[ netoff @ 07.04.2005. 12:56 ] @
Ne. Konstruktor klase T bi bio protected a singleton bi bila friend klasa, tako da moze da kreira novi objekat klase T. Da li bi to resnje moglo do bude adekvatno?
[ toroman @ 08.04.2005. 01:07 ] @
Po meni, koliko sam mogao da vidim, to jeste vrsta singletona. Naime, koliko god objekata tog singletona da napraviš, svi upućuju na isti objekat. Dakle to jeste VRSTA singletona. Pod pravim se podrazumijeva ovo što je ivbrcic postavio. To je pravi singleton. Ali i ovaj tvoj template ima sličnosti. Samo jednu instancu. Ali za razliku od ivbrcic-evog koda, ti možeš da pozoveš konstruktor. Prvi put kad pozoveš konstruktor, objekat će se ZAISTA kreirati. Od tad, pa nadalje, svaki put kad pozoveš konstruktor, tebi se samo uveća counter _c za jedan (kao evidencija o broju "instanci") a vrijednost koju će operator -> vratiti ostaje ista.
Ovakve vrste objekata se ipak koriste u druge svrhe. Možda o tome možeš da pročitaš nešto više u maltene svim knjigama koje je izdao Bruce Eckel :) On uvije mora da definiše šta je to singleton :) za svaki jezik, koji manijak ...
[ NastyBoy @ 08.04.2005. 13:36 ] @
Najdetaljniju obradu teme o singleton-ima ( i josh gomilu naprednih reshenja) imash u knjizi " Modern C++ design", by Andrei Alexandrescu. Obavezno prochitaj!
Anyway, reshenje koje ja koristim (kratko i jednostavno, intrusive reshenje, ali ne preterano elegantno), a koje ti omogucava da ubacish Singleton-pattern u bilo koju vec kreiranu klasu :
Code:
#define DECLARE_SINGLETON(n) public: static n& GetInstance(); private: n(); virtual ~n(); public:
#define IMPLEMENT_SINGLETON(n) n& n::GetInstance() {static n Instance; return instance;}
Na kraju, za klasu koju definishesh ka singleton dodash i malu sintaksnu olakshicu
Code: #define MyClass::GetInstance() g_MyClass
[ ivbrcic @ 08.04.2005. 13:57 ] @
Za sve koje zanima singleton, i ne samo to vec i druge stvari svakako jos uvijek ponajbolja knjiga je:
"Design Patterns" by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
Evo linka, pa koga zanima...
[url] http://rapidshare.de/files/701...ect-Oriented_Software.chm.html [/url]
[ toroman @ 08.04.2005. 15:05 ] @
Hvala za knjigu, btw, mrzim rapidshare :)
Hvala još jedanput ivbrčić-u.A ti Nasty, code ti je, što bi Englezi rekli "evil" zao :) Mnogo.
[ netoff @ 08.04.2005. 16:00 ] @
Zahvaljujem svima na iscrpnim odgovorima, koji su pomogli da iskristališem on što mi je potrebno.
Citat: NastyBoy: Najdetaljniju obradu teme o singleton-ima ( i josh gomilu naprednih reshenja) imash u knjizi "Modern C++ design", by Andrei Alexandrescu. Obavezno prochitaj!
Knjiga je zaista odlična i otvara nove poglede na c++. Aili singleton koji Alexandrescu daje je isuviše moćan za moje potrebe (a i koristi standardnu GetInstance() sintaksu), što je i bio razlog da postavim ovu temu, a u potrazi za jednostavnim hardcoded (bez policy-a), singethread singleton obrascem. Alexandrescu svakao razmatra svaki mogući aspekt korišćenja singleton-a, i to stavlja u odgovrajući policy, ali njegov pristup i dalje ostaje "standradan". Verovatno da to što sam zamislio predstavlja negi drugi obrazac što više nije ni bitno, jer sam u međuvremenu promenio pristup, tako da će i neki od ovih konvencionalnih singleton-a poslužiti. No da stavimo tačku na singleton, jer je verovatno rečeno sve što može o singleton-u da se kaže. Ono što mene interesuje je, da li neko od vas u komercijalne svrhe koristi metaprograming i obrascne na način na koji ih je predstavio Alexandrescu, i ako je tako da li koristite Loki, boost::mpl ili nešto treće. Koliko mislite da je isplativo projektovati na ovaj način i da li je to vredno uloženog vremena.
[ NastyBoy @ 08.04.2005. 17:22 ] @
Citat: Ono što mene interesuje je, da li neko od vas u komercijalne svrhe koristi metaprograming i obrascne na način na koji ih je predstavio Alexandrescu, i ako je tako da li koristite Loki, boost::mpl ili nešto treće. Koliko mislite da je isplativo projektovati na ovaj način i da li je to vredno uloženog vremena.
U game-engineu na kom se trenutno radi u mojoj firmi koristi se dosta od pomenutih tehnika. Narochito za stvari kao shto su templejtovana serijalizacija, intrusive smart-pointers, RTTI, (statichka) komunikacija editora sa engine-om preko parsovanja source fajlova (mislim da je parser iz boost-a), kao i type-liste za definisanje protokola za komunikaciju. "Sitne" stvari se takodje koriste, kao npr. templejtovani Hasher koji remapira stringove u editoru u ID-ove u samom engine-u... Ima toga dosta, ne mogu svega ni da se setim na brzinu :)
U svakom sluchaju, kod medium to big size projects, svaka investicija vremena i resursa u proverene obrasce kodiranja se vishestruko isplati (to se uvek nauchi na sopstvenim greshkama, na zhalost!)
[ dezelin32 @ 18.04.2005. 19:24 ] @
Nista od ovog koda nije thread-safe jer u metodi GetInstance() operacija new nije atomska - moguce je doci u situaciju da dva thread-a kreiraju jednu instancu vise. Potreban je tu kod za sinhronizaciju.
[ leka @ 20.04.2005. 08:05 ] @
Ove gore implementacije Singleton obrasca (pattern) su vise nego smesne. Niti su sigurne (pogotovo ne za primenu u visenitnim programima), niti su type-safe.
Najbolju implementaciju Singleton-a koju sam do sada video mozete naci u odlicnoj knjizi "Modern C++ Design: Generic Programming and Design Patterns Applied", Andrei Alexandrescu . Fajlove Singleton.(h|cpp) i Threads.h prilazem zapakovane uz poruku.
[ NastyBoy @ 20.04.2005. 13:23 ] @
Leko, Alexandrescu je vec pomenut kao izvor za duboku analizu Singleton-a, kome je potrebno.
Razlog za stavljanje jednostavnih reshenja je i u ovome: "Ali singleton koji Alexandrescu daje je isuviše moćan za moje potrebe (a i koristi standardnu GetInstance() sintaksu), što je i bio razlog da postavim ovu temu, a u potrazi za jednostavnim hardcoded (bez policy-a), singethread singleton obrascem."
Dakle, zashto komplikujete stvari?
[ leka @ 20.04.2005. 14:31 ] @
S obzirom da covek daje kod kao public domain, ne vidim razlog da ga ne uzmes i ne iskoristis - zbog toga sam i prilozio kod. Ne vidim razlog da se nesto sto vec postoji, besplatno, pise iznova i sumnjivog kvaliteta... No tvoja stvar...
Da ne bih ja komplikovao stvari, pocni od http://www.codeproject.com/cpp/singleton.asp .
[ netoff @ 20.04.2005. 22:06 ] @
Bojan je sve već rekao, nema stvarno potrebe da se dalje komplikuje nešto što je već jasno i rečeno. Tako da, iako imam šta da kažem na osnvu Dejanovog i Aleksandrovog komnetara, tj više imam da kažem o suvišnosti njihovih postova, mislim da stavimo tačku na ovu singleton priču.
[ mack @ 21.04.2005. 09:34 ] @
A da li negde moze da se skine aleksandreskuova knjiga ?
[ dezelin32 @ 21.04.2005. 09:39 ] @
Citat: tj više imam da kažem o suvišnosti njihovih postova
Suvisno ili ne, mislio sam da neznas da singleton ima i visenitnu dimenziju.
cheers
[ Dragi Tata @ 22.04.2005. 03:06 ] @
Citat: mack: A da li negde moze da se skine aleksandreskuova knjiga ?
Ovde je prvo i ključno poglavlje.
http://www.informit.com/articles/article.asp?p=167842&redir=1
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|