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)
izi*_*dor 12
经过一个小时的玩这个问题,我发现model是指向DataModel的指针,我的运算符<<只接受引用.
a.l*_*l.e 10
在您的示例中,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)
我也很难学到它......
您仅实现了 << 操作符作为参考。如果您的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)
这样,在退出该功能时,设置(即是否在打印之间插入或不插入空格)将被正确恢复。
| 归档时间: |
|
| 查看次数: |
15585 次 |
| 最近记录: |