Singleton, składowa statyczna - małe pytanie

0

Witam :). Dzisiaj wzięło mnie na singletony, chciałem "ogarnąć" temat. Ogólnie korzystam z tutoriala do c++ napisanego przez Xion'a
http://xion.org.pl/files/texts/mgt/html/1_7.html

Nie wiem czy ja coś źle przepisałem i źle zrozumiałem czy jest błąd w kodzie...

// *** plik nagłówkowy ***

// klasa singletonu

class CSingleton

{

   private:

         // statyczne pole, przechowujące wskaźnik na nasz jedyny obiekt

         static CSingleton* ms_pObiekt;           // [12]

   // (tutaj będą dalsze składowe klasy)

};

// *** moduł kodu ***

// trzeba rzecz jasna dołączyć tutaj nagłówek z definicją klasy

// inicjujemy pole wartością zerową (NULL)

CSingleton* CSingleton::ms_pObiekt = NULL;

CSingleton CSingleton::ms_pObiekt = NULL; przy tej linijce(umieściłem ją w main) visual c++ 2010 express wywala blad ze nie mozna sie odpowal w ten sposob czy cos takiego...
error C2655: 'CSingleton::ms_pObiekt' : definition or redeclaration illegal in current scope
error C2086: 'CSingleton
CSingleton::ms_pObiekt' : redefinition

Jak na moje oko to static CSingleton* ms_pObiekt; powinien byc w public zeby sie do niego odwolac, ale prosze o dwa slowa kogos obeznanego :). Pozdro

0

Nie musi być public, bo się do niego nie odwołujesz tylko inicjujesz zmienną globalną. Pamiętaj, żeby ta instrukcja inicjująca zmienną była tylko w jednym pliku cpp. Nie powinieneś jej umieszczać w pliku nagłówkowym. Inicjacja powinna być poza funkcjami.

0

Oto jak zaimplementować poprawnie wzorzec singleton:
-wszelkie konstruktory (w tym i kopiujący też) należy zdefiniować jako prywatne/protected
-to samo jeśli idzie o operator przypisania
-definiujesz statyczną,prywatną zmienną będącą wskaźnikiem na klasę singletonu,zainicjowaną zerem
-definiujesz statyczną,publiczną metodę YourSingleton* getInstance(void) która służyć będzie do pobierania wskaźnika do klasy singletonu.2 jej zadaniem jest utworzenie instancji singletonu podczas pierwszego wywołania

0

Właśnie, poza funkcjami... ;). Już działa jak należy. Może to głupie pytanie, ale dlaczego akurat poza funkcjami? Jeżeli jest na to jakieś w miarę proste uzasadnienie to poproszę, jeżeli tak po prostu jest to przeboleje.

1

takie są zasady inicjalizacji zmiennych globalnych.

Osobiście wolę tworzyć singleton troszkę inaczej, bez pola statycznego, w taki sposób:

CSingleton *CSingleton::getInstance()
{
    static CSingleton instance;
    return &instance;
}

W taki sposób singleton zostanie automatycznie zniszczony przy zakończeniu programu oraz kod jest prostszy.

0

Ok, dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0