首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重载qDebug的operator<<

如何重载qDebug的operator<<
EN

Stack Overflow用户
提问于 2010-04-21 02:17:51
回答 5查看 19K关注 0票数 23

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

代码语言:javascript
复制
#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;
}

我希望qDebug() << model会打印出"Hello world!“。但是,输出中总是有类似"QAbstractTableModel(0x1c7e520)“内容。

你知道出什么事了吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-21 02:57:32

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

票数 11
EN

Stack Overflow用户

发布于 2015-08-12 00:52:47

我知道这件事已经有很长时间了,但只是为了记录下来,并帮助其他最终有同样疑问的人,让qDebug() <<使用你自己的类打印"Hello World“或其他东西的最简单的方法是实现你的类到可打印类型的隐式转换,比如QString (这是QDebug很好的支持)。

代码语言:javascript
复制
class Foo {
public:
   Foo() { }
   operator QString() const { return <put your QString here>; }   

};
票数 28
EN

Stack Overflow用户

发布于 2012-11-10 17:31:30

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

事实上,似乎有两件事你必须要注意:

  • 通过值获取项(并且eugen已经指出了这一点!)。
  • 在使用之前定义重载运算符,将其签名放在头文件中,或者在使用它之前将其定义为转发(否则您将获得默认的"qDebug() <<“行为)。

这将为您提供:

代码语言:javascript
复制
QDebug operator<< (QDebug d, const DataModel &model) {
    d << "Hello world!";
    return d;
}
DataModel m;
qDebug() << "m" << m;

代码语言:javascript
复制
QDebug operator<< (QDebug d, const DataModel &model);

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

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

我也经历了很艰难的经历...

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2677577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档