SingelTon w QT. Zapętlanie się programu.

0

Witam

Pisze pewien program i chciałem, aby między innymi był łatwy dostęp do wskaźnika okna głównego. Postanowiłem zrobić to zgodnie z wzorcem singelton. Z tym, że nad oknem głównym jest klasa Program, która też jest singeltonem i to w niej tworze okno główne i parę innych rzeczy. W definicji klasy okna głównego deklaruje:

static Okno_GL *MainWindow; // private
 static Okno_GL *ObjectMain(); // public
Okno_GL() ; // private 

Definicje :

Okno_GL* Okno_GL::MainWindow = NULL;

Okno_GL * Okno_GL::ObjectMain()
{
    if(MainWindow==NULL)
    {
        Okno_GL *MainWindow = new Okno_GL();
        qd "wskaznik w konstruktorze" << MainWindow;
        return MainWindow;
    }
    else
    {
       return MainWindow;
    }

}

Teraz jeśli chce stworzyć pierwsze okno główne w klasie Program w ten sposób

Okno_GL *wsk = Okno_GL::ObjectMain()
wsk->show();

Program się zapętla i tworząc w kółko Różne obiekty okna głównego. Poniżej przedstawiam debug z konstruktora okna głównego.

konstruktor okna Okno_GL(0x127870c0)
konstruktor okna Okno_GL(0x13f31d88)
konstruktor okna Okno_GL(0x13f32c68)
konstruktor okna Okno_GL(0x13f7dfc0)
konstruktor okna Okno_GL(0x13f7eea0)
konstruktor okna Okno_GL(0x16268a60)
konstruktor okna Okno_GL(0x16269940)
konstruktor okna Okno_GL(0x164c8738)
konstruktor okna Okno_GL(0x164c9618)
itd

Gdzie błąd.

1
Okno_GL *MainWindow = new Okno_GL();

To jest utworzenie nowej zmiennej lokalnej o nazwie MainWindow a nie przypisanie wartości do pola klasy. Poza tym zmienne statyczne klasy muszą być zdefiniowane gdzieś poza ciałem klasy.

0

#&@&# faktycznie !!! co za przeoczenie !!!! Wszystko jasne ! Serdecznie dziękuje za pomoc.

edit::
poprawione na

Okno_GL* Okno_GL::MainWindow = NULL;

Okno_GL * Okno_GL::ObjectMain()
{
    if(Okno_GL::MainWindow==NULL)
    {
        Okno_GL::MainWindow = new Okno_GL();
        qd "wskaxnik w konstruktorze" << Okno_GL::MainWindow;
        return Okno_GL::MainWindow;
    }
    else
    {
       return Okno_GL::MainWindow;
    }

}

Okno główne tworzy się bez zapętlenia. Jednak gdy chce się odwołać do wskaźnika okna w jakiejś klasie która jest agregowana prze okno główne to program znów się zapętla :(

edit 2:

Złapałem go na pewnym zdarzeniu. Powyższy kod zmodyfikowałem do

Okno_GL* Okno_GL::MainWindow = NULL;

Okno_GL * Okno_GL::ObjectMain()
{
    if(Okno_GL::MainWindow==NULL)
    {
        qd "wywoluje konstruktor" ; // ta linia zostala dodana
        Okno_GL::MainWindow = new Okno_GL();
        qd "wskaxnik w konstruktorze" << Okno_GL::MainWindow;
        return Okno_GL::MainWindow;
    }
    else
    {
       return Okno_GL::MainWindow;
    }

}

Sugeruje to, że pomimo tego, że okno zostało stworzone w funkcji wskaźnik statyczny ma wartość 0, a nie powinien mieć ponieważ okno już istnieje. Umyka jakiś detal...

0

Rozbiłem temat :] Jak zwykle ścisłość i jeszcze raz ścisłość. Co się dzieje ? Załóżmy, że chce się odwołać do Okna głównego w z agregowanym obiekcie przez zeń. W obiekcie tym możliwe będzie odwołanie do okna tylko wtedy, jeśli wskaźnik statyczny będzie różny od zera. Jeśli tworzymy zagregowane obiekty w klasie głównego okna w konstruktorze, to wskaźnik statyczny ma ciągle wartość zerową, ponieważ jego wartość zostaje zapisana dopiero po instrukcji "return Okno_GL::MainWindow" , a my tkwimy cały czas w instrukcji " Okno_GL::MainWindow = new Okno_GL();" i to z niej chcemy odwołać się do wskaźnika okna głównego.
Rozwiązanie. Tworzenie okna głównego i obiektów okna głównego typu (button, textedit, label itp) poprzez interface z innego obiektu nadrzędnego np Program. Wtedy wszystko śmiga stabilnie. Czyli tworzymy Singeltona w połączeniu z fasadą. Singelton = Program , fasada = Okno_GL. Pozdrawiam temat do zamknięcia 8).

0

A może poczytasz o czymś takim jak kontener IoC? ;)

0

hmmm...Teraz to już umarł w butach bo mam już za bardzo rozwinięty kod, żeby przebudowywać, ale poszukam. Nie mniej może masz jakieś strony z info do polecenia z tym tematem, dobrze by było gdyby się znalazły jakieś przykłady w c++

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