我正在尝试使用QDataStream读写我的自定义类。我已经重写了<<和>>操作符,它们似乎对普通对象很好地工作。但是,当我试图传递指向自定义对象的指针时,重写的运算符不能正常工作。
以下是卡上的相关数据:
#ifndef CARD_H
#define CARD_H
#include <QDataStream>
#include <QImage>
#include <QString>
class Card
{
private:
QString name;
QImage image;
QString type;
int strength;
int movement;
int deployCost;
QString back;
public:
Card();
QDataStream& read(QDataStream &dataStream);
QDataStream& write(QDataStream &dataStream) const;
...
};
QDataStream& operator <<(QDataStream &out, const Card &c);
QDataStream& operator >>(QDataStream &in, Card &c);
QDataStream& operator <<(QDataStream &out, const Card *c);
QDataStream& operator >>(QDataStream &in, Card *c);
//QDataStream& operator <<(QDataStream &out, const Card *&c);
//QDataStream& operator >>(QDataStream &in, Card *&c);
#endif // CARD_H下面是card.cpp:
#include "card.h"
Card::Card()
{
}
QDataStream& operator <<(QDataStream &out, const Card &c) {
return c.write(out);
}
QDataStream& operator >>(QDataStream &in, Card &c) {
return c.read(in);
}
QDataStream& operator <<(QDataStream &out, const Card *c) {
return c->write(out);
}
QDataStream& operator >>(QDataStream &in, Card *c) {
return c->read(in);
}
/*QDataStream& operator <<(QDataStream &out, const Card *&c) {
return c->write(out);
}
QDataStream& operator >>(QDataStream &in, Card *&c) {
return c->read(in);
}*/
QDataStream& Card::read(QDataStream &dataStream) {
dataStream >> name;
dataStream >> image;
dataStream >> type;
dataStream >> strength;
dataStream >> movement;
dataStream >> deployCost;
dataStream >> back;
return dataStream;
}
QDataStream& Card::write(QDataStream &dataStream) const {
dataStream << name;
dataStream << image;
dataStream << type;
dataStream << strength;
dataStream << movement;
dataStream << deployCost;
dataStream << back;
return dataStream;
}
...如你所见,我都试过了
QDataStream& operator <<(QDataStream &out, const Card *c);
QDataStream& operator >>(QDataStream &in, Card *c);和
//QDataStream& operator <<(QDataStream &out, const Card *&c);
//QDataStream& operator >>(QDataStream &in, Card *&c);如果我使用"Card *c",数据会写得很好,但是当我尝试阅读时,我会得到一个SEGFAULT。如果我使用"Card *&c",程序甚至不承认我已经重写了操作符,所以它不会被调用。
我做错了什么?
编辑:
当我在读或写“卡片”时出现了这个问题,这是deck.h中定义为QHash的
QHash<QString, Card*> cards;甲板:
#ifndef DECK_H
#define DECK_H
#include <QDataStream>
#include <QHash>
#include "card.h"
class Deck
{
private:
QString name;
QHash<QString, Card*> cards;
public:
Deck();
QDataStream &read(QDataStream &dataStream);
QDataStream &write(QDataStream &dataStream) const;
...
};
QDataStream &operator<<(QDataStream &out, const Deck &d);
QDataStream &operator>>(QDataStream &in, Deck &d);
#endif // DECK_Hdeck.cpp:
#include "deck.h"
Deck::Deck()
{
}
QDataStream &operator<<(QDataStream &out, const Deck &d) {
return d.write(out);
}
QDataStream &operator>>(QDataStream &in, Deck &d) {
return d.read(in);
}
QDataStream &Deck::read(QDataStream &dataStream) {
dataStream >> name;
// Reading the QHash - one problem spot
dataStream >> cards;
return dataStream;
}
QDataStream &Deck::write(QDataStream &dataStream) const {
dataStream << name;
// Writing the QHash - the other problem spot
dataStream << cards;
return dataStream;
}
...因为卡片是作为指针存储在QHash中的,所以我不知道该如何绕过指针运算符。是否有更好的方法来读/写QHash,或者存储在QHash中的*卡?
编辑:
根据Marek R的回答,我想找一种避免写卡片的方法。解决方案是遍历QHash并保存每个单独的卡片。
发布于 2014-05-16 14:23:40
第一个问题是,您正在尝试对指针执行此操作符。如果我的同事这么做,我可能会试图勒死他。对于99.9999%的情况,从未重载指针操作符。
如果您坚持这样做,我猜您使用此操作符编写代码如下所示:
Card *uninitializedPointer;
someDataStream >> uninitializedPointer; // SEGFAULT这是错误的因为uninitializedPointer是..。它的名称说明了问题所在,您指的是受限的或随机的内存块。
也许您想要(这是错误的,但它会起作用,我展示这只是为了解释崩溃,而不是作为一个修复):
Card *initializedPointer = new Card;
someDataStream >> initializedPointer;或者:
Card object;
someDataStream >> &object;不要尝试通过操作符中的Do分配来修复这个问题,否则您会在地狱中被炒掉:)简单地,垃圾运算符重载了你真的不需要它们的指针。
发布于 2016-04-19 17:36:57
流运算符的预期签名如下:
stream& operator<<(stream& out, const T& t);
stream& operator>>(stream& in, T& t);例如,请参见How to properly overload the << operator for an ostream?或>。
这也适用于QDataStream。这里的困难在于,T是一个指针类型,但实际上您只需用指针类型替换T。所以你的签名应该是:
QDataStream& operator<<(QDataStream &out, Card* const& c);
QDataStream& operator>>(QDataStream &in, Card*& c);注意const在Card* const中的位置,因为需要的是指针,而不是切入点。
https://stackoverflow.com/questions/23693425
复制相似问题