首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt -对象指针重载的QDataStream (类*)

Qt -对象指针重载的QDataStream (类*)
EN

Stack Overflow用户
提问于 2014-05-16 05:49:28
回答 2查看 5.7K关注 0票数 1

我正在尝试使用QDataStream读写我的自定义类。我已经重写了<<和>>操作符,它们似乎对普通对象很好地工作。但是,当我试图传递指向自定义对象的指针时,重写的运算符不能正常工作。

以下是卡上的相关数据:

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

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

...

如你所见,我都试过了

代码语言:javascript
复制
QDataStream& operator <<(QDataStream &out, const Card *c);
QDataStream& operator >>(QDataStream &in, Card *c);

代码语言:javascript
复制
//QDataStream& operator <<(QDataStream &out, const Card *&c);
//QDataStream& operator >>(QDataStream &in, Card *&c);

如果我使用"Card *c",数据会写得很好,但是当我尝试阅读时,我会得到一个SEGFAULT。如果我使用"Card *&c",程序甚至不承认我已经重写了操作符,所以它不会被调用。

我做错了什么?

编辑:

当我在读或写“卡片”时出现了这个问题,这是deck.h中定义为QHash的

代码语言:javascript
复制
QHash<QString, Card*> cards;

甲板:

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

deck.cpp:

代码语言:javascript
复制
#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并保存每个单独的卡片。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-16 14:23:40

第一个问题是,您正在尝试对指针执行此操作符。如果我的同事这么做,我可能会试图勒死他。对于99.9999%的情况,从未重载指针操作符。

如果您坚持这样做,我猜您使用此操作符编写代码如下所示:

代码语言:javascript
复制
Card *uninitializedPointer;
someDataStream >> uninitializedPointer; // SEGFAULT

这是错误的因为uninitializedPointer是..。它的名称说明了问题所在,您指的是受限的或随机的内存块。

也许您想要(这是错误的,但它会起作用,我展示这只是为了解释崩溃,而不是作为一个修复):

代码语言:javascript
复制
Card *initializedPointer = new Card;
someDataStream >> initializedPointer;

或者:

代码语言:javascript
复制
Card object;
someDataStream >> &object;

不要尝试通过操作符中的Do分配来修复这个问题,否则您会在地狱中被炒掉:)简单地,垃圾运算符重载了你真的不需要它们的指针。

票数 4
EN

Stack Overflow用户

发布于 2016-04-19 17:36:57

流运算符的预期签名如下:

代码语言:javascript
复制
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。所以你的签名应该是:

代码语言:javascript
复制
QDataStream& operator<<(QDataStream &out, Card* const& c);
QDataStream& operator>>(QDataStream &in, Card*& c);

注意constCard* const中的位置,因为需要的是指针,而不是切入点。

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

https://stackoverflow.com/questions/23693425

复制
相关文章

相似问题

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