unarios ternarios sobrecargar sobrecarga sencillos relacionales operadores operador metodos matrices ejemplos c++ qt4 operator-overloading

c++ - ternarios - Como sobrecargar el operador<< para qDebug



sobrecarga de operadores unarios en c++ (5)

Estoy tratando de crear mensajes de depuración más útiles para mi clase donde almacenan datos. Mi código está buscando algo como esto

#include <QAbstractTableModel> #include <QDebug> /** * Model for storing data. */ class DataModel : public QAbstractTableModel { // for debugging purposes friend QDebug operator<< (QDebug d, const DataModel &model); //other stuff }; /** * Overloading operator for debugging purposes */ QDebug operator<< (QDebug d, const DataModel &model) { d << "Hello world!"; return d; }

Espero qDebug() << model imprimirá "¡Hola mundo!". Sin embargo, siempre hay algo como "QAbstractTableModel (0x1c7e520)" en la salida.

¿Tienes alguna idea de lo que está mal?


Después de una hora de jugar con esta pregunta, descubrí que el model apunta a DataModel y mi operador << solo toma referencias.


En su ejemplo, qDebug () imprime la dirección de su variable, que es el comportamiento predeterminado para tipos desconocidos.

De hecho, parece que hay dos cosas que debes cuidar:

  • Obtenga el artículo por valor (¡y eugen ya lo señaló!).
  • Defina el operador de sobrecarga antes de usarlo, coloque su firma en el archivo de encabezado o defíntalo como adelante antes de usarlo (de lo contrario obtendrá el comportamiento predeterminado "qDebug () <<").

Esto te dará:

QDebug operator<< (QDebug d, const DataModel &model) { d << "Hello world!"; return d; } DataModel m; qDebug() << "m" << m;

o

QDebug operator<< (QDebug d, const DataModel &model); DataModel m; qDebug() << "m" << m; QDebug operator<< (QDebug d, const DataModel &model) { d << "Hello world!"; return d; }

Lo he aprendido de la manera difícil, también ...


Encontré esta respuesta en el foro de QT por raven-worx (¡dando crédito a quien se debe!)

En el archivo .h :

QDebug operator<<(QDebug dbg, const MyType &type);

donde MyType es su clase, como DataModel y type es la instancia que mostrará.

Y en el archivo .cpp :

QDebug operator<<(QDebug dbg, const MyType &type) { dbg.nospace() << "MyType(" << .... << ")"; return dbg.maybeSpace(); }

y puede utilizar el space() QDebug space() , nospace() y otros métodos para controlar la visualización exacta de la transmisión.

Así que para el OP usaríamos:

// in the .h file: class DataModel : public QAbstractTableModel { // stuff }; QDebug operator<<(QDebug dbg, const DataModel &data); // in the .cpp file: QDebug operator<<(QDebug dbg, const DataModel &data) { dbg.nospace() << "My data {" << data.someField << '','' << data.another << "}"; return dbg.maybeSpace(); } // in some .cpp user of the class: DataModel myData; . . . QDebug() << "The current value of myData is" << myData;


Lo sé hace mucho tiempo, pero solo para estar documentado y ayudar a cualquier otra persona que eventualmente venga aquí con la misma duda, la forma más fácil de obtener qDebug () << trabajar con su propia clase imprimiendo algo como "Hola mundo" o lo que sea, es implementar la conversión implícita de su clase a un tipo imprimible, como QString (que está bien soportado por QDebug).

class Foo { public: Foo() { } operator QString() const { return <put your QString here>; } };


Usted implementó solo el operador << para una referencia. Si su variable model es un puntero, usará otra implementación (no la suya).

Para utilizar tu implementación puedes hacer:

qDebug() << *model

Por cierto, la forma correcta de implementar una QDebug operator<<(QDebug dbg, const T &data) es usar la clase QDebugStateSaver :

QDebug operator<<(QDebug dbg, const QDataflowModelOutlet &outlet) { QDebugStateSaver stateSaver(dbg); dbg.nospace() << ...; return dbg; }

De esta manera, la configuración (es decir, si se insertan o no espacios entre las impresiones) se restaurará correctamente al salir de la función.