Witam.

Potrzebuje użyć wzorca mediator w Qt. Z napisaniem go nie było najmniejszego problemu. Cały mechanizm działa, jednak tylko w specyficznych okolicznościach. Myślę, że przyczyną jest nieskończona pętla programu. Będę stosował pewne skróty myślowe, ale na pewno zrozumiecie problem. Główny problem, polega na tym, że nie można zarejestrować obiektu do mediatora z innej klasy niż klasa Singeltona, która jest Program.

Ma pewną klasę Program, która jest Singeltonem. W Niej tworze mediatora oraz dwa obiekty: główne okno programu, klasę do obsługi udp.

void Program::CreateObject()
{

    mediat = new Mediator(); // mediator
    
    window = new Okno_GL(); // okno glowne dziedziczące po QMainWindow i po objekcie Object ( interface dla mediatora)
    window->show(); // pokazujemy okienko

    udp = new UdpTransmit();   // moja klasa dziedzicząca po QUdp i po Interface Object
   
}

Teraz funkcja rejestrująca obiekty dla mediatora.

void Program::RegisterObject()
{
    mediat->AddObject(window);
    mediat->AddObject(udp);

Aby to ruszyło wszystko tworzę w main

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Program *prg;
    prg = Program::PointerToProgram();
    prg->CreateObject();
    prg->RegisterObject();
    return a.exec();
} 

W ten sposób uzyskuje komunikację między klasą okna a klasa UDP. Komunikacja odbywa się banalnie poprzez funkcję virtualne. Funkcje te są w objekcie Object

class Object
{


protected:
    QString Name;
    Mediator *medium;
public:
    Object(QString Name);
    virtual void Send(QString to , QVector<QString> vect);
    virtual void Send(QString to , QString message);
    virtual void Send(QString to , QVector<int> vect);
    virtual void receive(QString from , QVector<QString> vect);
    virtual void receive(QString from , QVector<int> vect);
    virtual void receive(QString from , QString message);
    void setMediator(Mediator *medium);


    QString name();
    Mediator* mediator();

};

Funkcja Object

void Object::Send(QString to, QString message)
{
   
    medium->Send(Name , to , message);

}

Ta funkcja trafia do mediatora

void Mediator::Send(QString from, QString to, QString message)
{


    QMap <QString , Object*>::iterator iter;
    iter = ListObject.find(to);
    if(iter == ListObject.end())
    {
        qd "nie znaleziono obiektu";
    }
    else
    {

        iter.value()->receive(from , message);
    }
}

Czyli w kalsie Okna głównego piszemy np
Send("UDP" , "Helooo");
i dostajemy w klasie UDP w przeładowanej receive powyższy komunikat. To działa.

Problem pojawia się wtedy, gdy W klasie Okna_GL tworzę jakiś obiekt i chce go zarejestrować w mediatorze. Obiekt się po prostu nie rejestruje. Czyli jeśli np chcę

void Okno_GL::setupLog()
{
    loginfo = new Log(); // moja klasa dziedzicząca po QTextEdit i po interface Object
    Program::PointerToProgram->addMediator(loginfo); // czyli rejestracja z klasy której właścicielem jest Program. 

/* To co powyżej trafia tu

void Program::SLOT_AddObjectToMediator(Object *obj)
{
    qd " dodaje" << obj;
    mediat->AddObject(obj);
}*/

}

Wtedy do wskaźnika Mediator *medium , nie trafia żadna wartość. Program się wiesza bez komunikatów ponieważ Wskaźnik medium ma wartość NULL;

Problem zostaje rozwiązany gdy Obiekt Log zarejestruje z klasy Program czyli

mediat->AddObject(window->rLog());

Myślę, że jest tutaj pewien problem z nieskończonymi pętlami, tylko nie wiem jak to rozwiązać. Chciałbym po prostu móc rejestrować obiekty do mediatora z różnych klas, a nie tylko z klasy Program.