Ripetendo Q_DISABLE_COPY nelle classi derivate da QObject

In Qt è presente una macro che consente di dichiarare costrutti di copia privati ​​e operatori di assegnazione per le classi: http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#Q_DISABLE_COPY

Si dice che questa macro dovrebbe essere usata per tutte le classi derivate QObject (specialmente QWidget).

Capisco come funziona e perché è utile.

Cosa non capisco: C’è qualche motivo per ripetere Q_DISABLE_COPY nelle mie classi derivate QObject mentre QObject contiene già Q_DISABLE_COPY e attraverso questo evita efficacemente la copia delle mie classi derivate?

Il messaggio di errore che potrebbe essere stampato dal tentativo di copiare la class derivata potrebbe fare riferimento a QObject anziché al codice, quindi l’errore potrebbe sembrare confuso. Ad esempio, utilizzando Visual Studio 2012 per compilare questo codice

class MyClass : public QObject { }; int main(int argc, char *argv[]) { Q_INIT_RESOURCE(application); MyClass obj1; MyClass obj2(obj1); QApplication app(argc, argv); app.setOrganizationName("QtProject"); app.setApplicationName("Application Example"); MainWindow mainWin; mainWin.show(); return app.exec(); } 

genera questo errore (e una serie di riferimenti a QObject).

errore: C2248: ‘QObject :: QObject’: imansible accedere al membro privato dichiarato nella class ‘QObject’

Modifica di MyClass in

 class MyClass : public QObject { private: Q_DISABLE_COPY(MyClass) public: MyClass(); }; 

si traduce in un gruppo di errori molto più user friendly che si riferiscono a MyClass, a partire da

errore: C2248: ‘MyClass :: MyClass’: imansible accedere al membro privato dichiarato nella class ‘MyClass’

Penso che il secondo messaggio di errore sia più facile da capire per qualcuno che è nuovo a Qt.

La definizione di MyClass è anche autodocumentante se Q_DISABLE_COPY è incluso nella definizione di class per chiunque legga il codice.

Un altro motivo per ripetere la definizione nelle classi derivate è di proteggere il codice dai futuri bug se l’implementazione di QObject viene modificata per non utilizzare più Q_DISABLE_COPY (). Anche se questo è improbabile, documentando questo requisito gli sviluppatori di Qt si sono lasciati un po ‘di spazio di manovra se decidessero di cambiare QObject.