Ero nel canale #Qt irc, e ho mostrato un piccolo frammento del mio codice in uno stile su cui faccio molto affidamento. Sembra così:
/* Get Reply from Server */
QPointer<QNetworkReply> reply;
{
QEventLoop waitForFile; // A QObject
connect(&m_NetworkAccessManager, &QNetworkAccessManager::finished, &waitForFile, &QEventLoop::quit);
reply = m_NetworkAccessManager.get(request);
waitForFile.exec();
disconnect(&m_NetworkAccessManager, &QNetworkAccessManager::finished, &waitForFile, &QEventLoop::quit);
}
Mi è stato detto che il codice era piuttosto strano, il che non mi sorprende. Tendo a fare molto affidamento sullo stack e sono molto attento a controllare il ciclo di vita con {
e }
- Fondamentalmente il mio principio di funzionamento è stato
Delete all objects ASAP using scope.
In questo caso, il QEventLoop
non ha bisogno di esistere oltre questo ambito e la sua utilità è relativa solo a QPointer<QNetworkReply> reply;
, che è un ulteriore vantaggio per la leggibilità.
In ogni caso, quel codice ha richiesto la dichiarazione:
You should always allocate qobjects on the heap
Abbiamo avuto un po 'di discussione su questo. Francamente sono rimasto scioccato, perché ho operato sotto l'idea che:
Fear QObject pointers, and only use them for very specific usecases such as:
- If a parameter is designed to be able to accept NULL values.
- If the object being passed to a function is large, and a reference can not be used.
- If the object will be added to a QList.
- If you are developing a GUI, where parent/child relationships are paramount
- If you are working with special types, like QFile or QThread, where copying instances of these objects is conceptually null. (You wouldnt want two QFile's of the same file.)
Dopo aver dato le mie ragioni, si sono impegnate abbastanza duramente a lavorare secondo il principio di Always allocate QObjects to the heap.
. Penso che se tu potessi farlo in modo abbastanza sicuro usando lo stack, non c'è una buona ragione per cui non vuoi un QObject sullo heap, data la facilità con cui QObject Lifecycle è in confronto alla semplice esecuzione dei puntatori del millimetro.
Penso che l'unico contesto pertinente da menzionare sia che questi sviluppatori erano principalmente abituati allo sviluppo di GUI, dove utilizzo Qt quasi esclusivamente per applicazioni console, il che si traduce in requisiti di codifica molto lineari.
E nonostante tutto questo, non ho una buona risposta.
Sono corretti? Ci sono dei buoni motivi per NON mettere un QObject
sull'heap, anche se è progettato per funzionare in sicurezza?
Grazie.