2013-06-09 5 views
21

In C++, public significa che i membri accessibili da qualsiasi luogo in cui l'oggetto è visibile, private significa che i membri sono accessibili solo da altri membri della stessa classe o dai propri amici.Fa alcuna differenza, usando le slots pubbliche invece degli slot privati ​​in Qt?

Ma in Qt, la differenza in private slots e public slots sembra non esistere. Ho iniziato a scrivere Qt negli ultimi giorni, e ho usato private slots tutto il tempo.

Qualcuno mi ha detto che dovrei usare public slots invece. Quindi ora sono perplesso. Non riesco a trovare informazioni di riferimento nei documenti di Qt.

Qual è la differenza effettiva tra i due tipi?

+0

possibile duplicato di [Qt "slot privato:" cos'è questo?] (http://stackoverflow.com/questions/9147636/qt-private-slots-what-is-this) – kolen

risposta

14

L'accesso pubblico/privato viene "controllato" dal compilatore in fase di compilazione, ma la connessione dello slot di segnale viene eseguita in fase di esecuzione e gli slot vengono richiamati da alcuni meccanismi QMetaObject (qualcosa come ad esempio invokeMethod).

Quindi la differenza è questa: slot privati ​​ sono privato se chiamato come funzioni membro regolari, ma sempre "pubblica" per i segnali ad invocare, un buon motivo è perché gli slot concettualmente sono un'interfaccia pubblica, dal momento che la loro principale lo scopo è la comunicazione tra oggetti

Un altro esempio di alcuni elementi "strani" correlati è la chiamata di funzioni virtuali private se sono pubbliche nel tipo statico del puntatore utilizzato per chiamare il metodo.

+6

Piccola appendice: per gli slot veramente privati ​​si può anche usare il meccanismo (non documentato, interno) 'Q_PRIVATE_SLOT', che consente di definire lo slot in un altro - di solito privato - classe . – peppe

+0

@peppe non sapevo di Q_PRIVATE_SLOT, grazie – Zlatomir

25

Da Qt Documentation:

Poiché le scanalature sono normali funzioni membro, seguono le normali regole C++ quando viene chiamato direttamente. Tuttavia, come slot, possono essere richiamati da qualsiasi componente, indipendentemente dal suo livello di accesso, tramite una connessione slot di segnale. Ciò significa che un segnale emesso da un'istanza di una classe arbitraria può causare l'invocazione di uno slot privato in un'istanza di una classe non correlata.

Che cosa questo significa: da un'altra classe, non si può chiamare uno slot privata come una funzione, ma se emettere un segnale collegato a quello slot privata, è possibile richiamarlo.

3

@ user2448027 risposta è corretta, ma perché, c'è un punto mancante nel modello di progettazione di Qt e diverse applicazioni di private slots vs. slots` pubblico non è accennato altrove, io, deciso di rispondere a questo argomento vecchio: Rendendo privati ​​gli slot costringi l'utente dell'oggetto a utilizzare la funzione di connessione per chiamare lo slot non direttamente da. o -> operatore

Immagina un caso in cui hai implementato un codice lento o di blocco in uno degli slot della classe e ti aspetti che l'utente della classe sposti l'oggetto creato su un thread, quindi la classe proprietario di questo oggetto (che potrebbe essere la GUI o qualche oggetto correlato alla GUI) non si bloccherebbe o bloccherebbe chiamando questo slot. Ecco il punto che se la chiamata allo slot viene eseguita direttamente utilizzando gli operatori . o ->, verrà bloccata. Poiché il thread corrente del metodo chiamante utilizzerà lo slot, e ciò avverrà solo se sono stati utilizzati spazi pubblici. La soluzione è rendere lo slot privato in modo che l'utilizzo possa solo chiamarlo attraverso la connessione non direttamente.

Conclusione:

  • Se avete il blocco slot, essere sicuri per la loro attuazione, come slot privati.
  • se gli slot sono utilizzati come semplici impostazioni di proprietà per l'oggetto renderli slot pubblici
  • Infine, se avete bisogno di alcuni metodi whith valori di ritorno o argomenti di riferimento incostanti non hanno nemmeno farli slot (è è una sciocchezza) , solo il pubblico è sufficiente