如何重载operator << for qDebug

izi*_*dor 19 c++ qt4 operator-overloading

我正在尝试为我的类存储数据创建更有用的调试消息.我的代码看起来像这样

#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;
}
Run Code Online (Sandbox Code Playgroud)

我希望qDebug() << model打印出"Hello world!".但是,输出总是有"QAbstractTableModel(0x1c7e520)"之类的东西.

你知道什么是错的吗?

Vin*_*rge 22

我现在知道很久了,但只是为了记录并帮助其他最终来到这里的人有同样的疑问,最简单的方法来获得qDebug()<<与你自己的班级合作打印类似"Hello World"或无论如何,是实现类的隐式转换为可打印类型,如QString(QDebug很好地支持).

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

};
Run Code Online (Sandbox Code Playgroud)

  • 将隐式转换运算符用于“QString”可能很危险。例如,它启用类似的东西:`QVariant(myFooInstance)`,但它不是存储一个 `Foo` 实例,而是将其转换为 `QString` 并存储它。 (5认同)
  • 这比重载`<<`更有用,更易于管理.谢谢! (4认同)
  • 考虑这个问题,如果您要打印的类是第三方类,则本主题中的第一个解决方案(重载运算符&lt;&lt;)将是唯一的解决方案。如果类实现是你的,我的方法比另一个简单得多。 (2认同)

izi*_*dor 12

经过一个小时的玩这个问题,我发现model是指向DataModel的指针,我的运算符<<只接受引用.

  • 对不起,您能否进一步扩展您的答案?我试图达到同样但我不能.提前致谢 (2认同)

a.l*_*l.e 10

在您的示例中,qDebug()打印变量的地址,这是未知类型的默认行为.

事实上,你需要注意两件事:

  • 按值获取项目(而且eugen已经指出了它!).
  • 在使用之前定义重载运算符,将其签名放在头文件中,或在使用之前将其定义为forward(否则您将获得默认的"qDebug()<<"行为).

这会给你:

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

要么

QDebug operator<< (QDebug d, const DataModel &model);

DataModel m;
qDebug() << "m" << m;

QDebug operator<< (QDebug d, const DataModel &model) {
    d << "Hello world!";
    return d;
}
Run Code Online (Sandbox Code Playgroud)

我也很难学到它......


ffe*_*rri 8

您仅实现了 << 操作符作为参考。如果您的model变量是一个指针,它将使用另一个实现(不是您的)。

要使用您的实现,您可以执行以下操作:

qDebug() << *model
Run Code Online (Sandbox Code Playgroud)

顺便说一句,实现QDebug operator<<(QDebug dbg, const T &data)重载的正确方法是使用QDebugStateSaver类:

QDebug operator<<(QDebug dbg, const QDataflowModelOutlet &outlet)
{
    QDebugStateSaver stateSaver(dbg);
    dbg.nospace() << ...;
    return dbg;
}
Run Code Online (Sandbox Code Playgroud)

这样,在退出该功能时,设置(即是否在打印之间插入或不插入空格)将被正确恢复。