2013-06-09 12 views
21

W języku C++, public oznacza członków dostępnych z dowolnego miejsca, w którym obiekt jest widoczny, private oznacza, że ​​członkowie są dostępni tylko od innych członków tej samej klasy lub od ich znajomych.Czy to ma znaczenie, używając publicznych automatów zamiast prywatnych automatów w Qt?

Ale w Qt różnica w private slots i public slots wydaje się nie istnieć. Zacząłem pisać Qt w ostatnich dniach i cały czas używałem private slots.

Ktoś powiedział mi, że powinienem zamiast tego użyć public slots. Teraz jestem zdziwiony. Nie mogę znaleźć informacji referencyjnych w dokumentach Qt.

Jaka jest rzeczywista różnica między tymi dwoma typami?

+0

możliwy duplikat [Qt "prywatnych automatów:" co to jest? "(http://stackoverflow.com/questions/9147636/qt-private-slots-what-is-this) – kolen

Odpowiedz

14

Dostęp prywatny/publiczny jest "sprawdzany" przez kompilator w czasie kompilacji, ale połączenie z gniazdami sygnałowymi jest wykonywane w czasie wykonywania, a gniazda są wywoływane przez niektóre mechanizmy QMetaObject (coś jak na przykład invokeMethod).

Więc różnica jest taka: prywatne slotyprywatną jeśli nazywa się regularnych funkcji składowych, ale zawsze „publicznego” dla sygnałów powołać, to dobry powód jest ponieważ szczeliny koncepcyjnie to interfejs publiczny, ponieważ ich głównym celem jest komunikacja międzyobiektowa

Innym przykładem na temat pewnych powiązanych "dziwnych" rzeczy jest wywołanie prywatnych funkcji wirtualnych, jeśli są one publiczne w statycznym typie wskaźnika, który jest używany do wywoływania metody.

+6

Mały dodatek: dla prawdziwie prywatnych automatów można również użyć (nieudokumentowanego, wewnętrznego) mechanizmu 'Q_PRIVATE_SLOT', który pozwala zdefiniować slot w innej - zwykle prywatnej - klasie . – peppe

+0

@peppe Nie wiedziałem o Q_PRIVATE_SLOT, dziękuję – Zlatomir

25

Od Qt Documentation:

Od szczeliny są normalne funkcje składowe, wykonaj one normalne C++ zasady gdy wywoływany bezpośrednio. Jednakże, jako sloty, mogą być wywoływane przez dowolny komponent, niezależnie od jego poziomu dostępu, za pośrednictwem połączenia sygnał-gniazdo. Oznacza to, że sygnał emitowany przez instancję dowolnej klasy może spowodować wywołanie prywatnego slotu w instancji niepowiązanej klasy.

Co to znaczy: z innej klasy, nie można nazwać prywatną gniazdo jako funkcję, ale jeśli emitowania sygnału podłączonego do tej samej prywatnej szczeliny, można go wywołać.

3

@ user2448027 odpowiedź jest poprawna, ale dlatego, że jest brakujący punkt wzorca projektowego Qt i różnych zastosowań z private slots vs. slots` publicznej nie wymienionych gdzie indziej, I, postanowił odpowiedzieć na to stary temat: Tworząc gniazda prywatne, zmuszasz użytkownika obiektu do użycia funkcji łączenia, aby wywołać slot nie bezpośrednio przez. lub -> operator

Wyobraź sobie, że zaimplementowałeś powolny lub blokujący kod w jednym ze slotów swojej klasy i oczekujesz, że użytkownik klasy przeniesie utworzony obiekt do wątku, więc klasa właściciela tego obiekt (który mógłby być GUI lub jakiś obiekt powiązany z GUI) nie zamarzłby ani nie zablokowałby się przez wywołanie tego slotu. Tutaj jest to, że jeśli wywołanie do szczeliny wykonane bezpośrednio przy użyciu operatorów . lub ->, zostanie zablokowane. Ponieważ bieżący wątek metody wywołującej będzie korzystał z tego gniazda, stanie się to tylko wtedy, gdy używałeś publicznych boksów. Rozwiązaniem jest ustawienie gniazda jako prywatnego, więc użycie może wywoływać tylko połączenie bezpośrednio.

Wniosek:

  • Jeśli blokowania szczeliny, należy je wdrożyć w prywatnych gniazd.
  • czy szczeliny są wykorzystywane jako proste ustawienia właściwości dla obiektu uczynić je szczeliny publicznych
  • wreszcie jeśli trzeba kilka metod whith wartości zwracanych lub niestałe argumentów referencyjnych nawet nie sprawiają im szczeliny (to jest nonsens) , tylko publiczna wystarcza
Powiązane problemy