2012-07-03 6 views
6

Ho un'applicazione MainWindow su cui sto lavorando per imparare C++ e Qt (C++ e QT 4.8). Voglio fare richieste HTTP in diversi oggetti della mia applicazione, come Dialoghi/Wizard e nella Finestra Principale. So che fondamentalmente dovrei avere un QNetworkAccessManager per applicazione. La mia domanda è, qual è il modo corretto per passare questo QNAM tra le classi?Come utilizzare QNetworkAccessManager in classi diverse? Condivisione generale di dati importanti tra le classi?

Al momento ho come un puntatore passo al costruttore della mia procedura guidata, ma questo sembra ... poco elegante e poco flessibile. Qual è il modo corretto di dare i miei dialoghi o qualsiasi altra classe che decido di fare, accedere al mio QNetworkAccessManager? Immagino di avere la stessa domanda su qualsiasi pezzo di dati a cui devo dare accesso.

Qual è la soluzione progettata correttamente in C++? Il modello singleton sembra un'opzione, ma una cattiva come capisco. Ho un po 'di codice qui per mostrare la mia domanda.

mio MainWindow costruttore e slot di cui lanciare la mia procedura guidata:

MyMainWindow::MyMainWindow 
{ 
    qnam = new QNetworkAccessManager(); 
} 

... 

MyMainWindow::wizardStarter 
{ 
    mywizard = MyWizard(vari, qnam, this); 
} 

mio guidata Constructor in cui sto facendo richieste di rete e analisi dei dati dopo aver ottenuto i dati da parte dell'utente, e quindi in cui ho bisogno di un QNetworkAccessManager :

MyWizard::MyWizard(SomeOtherArgument *vari, QNetworkAccessManager *qnam, QObject *parent) 
{ 
    ... 
    this->ourQnam = qnam; 
    ... 
} 

MyWizard::launchRequest(QUrl newUrl) 
{ 
    ourQnam->get(QNetworkRequest(newUrl)); 
} 
+0

vi consiglio design pattern Singleton. Perché pensi che questo modello sia cattivo? – hamed

+1

@hamed, i singleton nascondono le relazioni di dipendenza tra le classi se non si utilizza un'iniezione di dipendenza appropriata. Nulla di sbagliato con il modello di progettazione singleton basta utilizzare l'iniezione corretta per comunicare che la classe dipende dal singleton. – Matthew

+0

Come aggiungere una iniezione appropriata nel caso di un singleton? – MJBoa

risposta

5

Dalla tua domanda, penso che stai davvero chiedendo quale forma di iniezione di dipendenza (cioè iniettando il tuo Depen ammaccare QNetworkAccessManager in oggetti) da utilizzare.

Nel tuo caso si sta utilizzando Constructor iniezione. Questa è una forma di iniezione perfettamente conosciuta e accettata. Comunica fortemente la tua classe guidata dipende da QNetworkAccessManager che rende il tuo codice facile da capire per le persone. Se si dovesse utilizzare un singleton per semplicemente afferrare un QNetworkAccessManager statico dall'interno dell'implementazione della classe guidata, mentre ha il vantaggio di rimuovere l'iniezione del costruttore, si nasconde che la classe della procedura guidata utilizza QNetworkAccessManager.

Un'altra forma ben nota di iniezione è iniezione Setter cioè setDelegate(delegate)

professionalmente parlando non c'è niente di sbagliato con il tuo approccio attuale come ancora una volta si comunica chiaramente la classe guidata dipende l'oggetto QNetworkAccessManager.

Ecco un po 'di lettura se si è interessati a saperne di più sull'iniezione di dipendenza.

Dependency Injection

Dependency Injection in C++

Problemi correlati