• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Implementacja Singletona w c++

Object Storage Arubacloud
0 głosów
315 wizyt
pytanie zadane 15 grudnia 2018 w C i C++ przez dawid2002 Mądrala (5,190 p.)
zamknięte 15 grudnia 2018 przez dawid2002

Witam, mam ostatnio taki problem, że chciałem stworzyć klasę, która miała być Singletonem, ale kod mi niestety nie działa!

#include <iostream>

using namespace std;

class C_Singleton
{

    static C_Singleton *instancja;

    C_Singleton() {}
    C_Singleton(const C_Singleton &A);

public:

    string name;

    static C_Singleton& get_instance()
    {

        if(instancja == NULL)
            instancja = new C_Singleton();

        return *instancja;
    }

    ~C_Singleton()
    {
        delete this;
    }
};

int main()
{
   C_Singleton s1 = C_Singleton::get_instance();

   s1.name = "ABC";

   return 0;
}

Nie wiem co jest tutaj nie tak i nie rozumiem czemu kompilator pokazuje błąd!

Jeśli ktoś może mi pomóc z implementacją tego kodu to bardzo dziękuje!

komentarz zamknięcia: znam już odpowiedź na moje pytanie

3 odpowiedzi

+1 głos
odpowiedź 15 grudnia 2018 przez monika90 Pasjonat (22,940 p.)
wybrane 15 grudnia 2018 przez dawid2002
 
Najlepsza

Po pierwsze, nie powinno się używać singletonów.

s1 powinno być referencją, czyli tak:

 C_Singleton& s1 = C_Singleton::get_instance(); 

Brakuje też definicji składowej instancja, dodaj to po definicji klasy:

C_Singleton *C_Singleton::instancja;

A destruktor jest nonsensowny z powodu nieskończonej rekursji.

I oczywiście, jak zwykle, brakuje #include <string>

komentarz 15 grudnia 2018 przez Ehlert Ekspert (212,670 p.)
Z tego co kojarzę to delete this może mieć sens ale łatwo o undefined behaviour.
komentarz 15 grudnia 2018 przez monika90 Pasjonat (22,940 p.)
delete this w destruktorze nie ma sensu , bo samo wywołuje destruktor.
komentarz 15 grudnia 2018 przez dawid2002 Mądrala (5,190 p.)

@monika90,  

Dzięki za pomoc. Aczkolwiek nie rozumiem czemu trzeba wstawiać ponownie definicje tego wskaźnika "instancja" skoro już ona jest w linijce 8 ?

komentarz 15 grudnia 2018 przez monika90 Pasjonat (22,940 p.)
W linii 8 masz tylko deklarację, statyczne dane składowe wymagają też definicji poza klasą w pliku *.cpp, nie w *.h (choć nie zawsze, ale zostawmy to na razie).
komentarz 15 grudnia 2018 przez dawid2002 Mądrala (5,190 p.)
dzięki za pomoc!
0 głosów
odpowiedź 15 grudnia 2018 przez jankustosz1 Nałogowiec (35,880 p.)
This nie jest tworzone dynamicznie wiec nie możesz robić na nim delete. Albo możesz juz sam nie wiem.

instancja lepiej jakby byla typem shared_ptr

Nie możesz przypisać do s1 bo nie stworzyłeś odpowiedniego operatora, ani konstruktora
komentarz 15 grudnia 2018 przez dawid2002 Mądrala (5,190 p.)
słusznie! dzięki , będę miał to na uwadze.
0 głosów
odpowiedź 15 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
Od C++11 wystarczy zwykły static by mieć atomową inicjalizację:

https://godbolt.org/z/z9c_-c

Poza tym, przychylam się. Singleton to nieodpowiedni wzorzec.
komentarz 16 grudnia 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Co jest złego w singletonie? Jeżeli singleton jest zły bo jest globalny to tym tokiem rozumowania zmienne statyczne też są złe. Mylę się?
komentarz 16 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
Już tyle o tym napisano...

https://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons

https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what

Książka: Modern C++ Design - Alexandrescu, poświęca singletonom cały rozdział. Jest to prezentacja punktu widzenia "przed C++11". BTW książka ciągle warta przeczytania także z innych powodów.

Podobne pytania

0 głosów
0 odpowiedzi 309 wizyt
pytanie zadane 18 kwietnia 2020 w C i C++ przez Bartosz Paterek Początkujący (410 p.)
0 głosów
1 odpowiedź 198 wizyt

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...