Qt-具有重载运算符<<的QDataStream用于对象指针(类*) [英] Qt - QDataStream with overloaded operator<< for object pointer (Class*)

查看:297
本文介绍了Qt-具有重载运算符<<的QDataStream用于对象指针(类*)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用QDataStream读取/写入我的自定义类.我已经覆盖了<<和>>运算符,对于普通对象似乎工作正常.但是,当我尝试将指针传递给自定义对象时,被覆盖的运算符将无法正常工作.

I am trying to read/write my custom classes using QDataStream. I have overridden the << and >> operators, which seem to work fine for normal objects. However, when I try to pass a pointer to my custom object, the overridden operators don't work properly.

这是card.h中的相关数据:

Here is the relevant data from card.h:

#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:

And here is 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",则该程序甚至无法识别出我已经覆盖了运算符,因此不会被调用.

If I use "Card *c", the data writes fine, but I get a SEGFAULT when I try to read. If I use "Card *&c", the program doesn't even recognize that I've overridden the operator, so it doesn't get called.

我在做什么错了?

当我读或写"cards"时出现问题,这是在eck.h中定义为QHash的

The problem comes when I am reading or writing "cards" which is a QHash defined in deck.h as

QHash<QString, Card*> cards;

deck.h:

#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:

#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中的* Card?

Because the cards are stored as pointers in the QHash, I'm not sure how I am supposed to get around overriding the pointer operator. Is there a better way to read/write the QHash, or the *Card stored in the QHash?

根据Marek R的回答,我正在寻找一种避免写Card *的方法.解决方案是遍历QHash并保存每张卡.

As per Marek R's answer, I looked for a way to avoid writing a Card*. The solution was to iterate through the QHash and save each individual Card.

推荐答案

第一个问题是您试图对指针执行此运算符. 如果我的同事愿意这样做,我可能会试图扼杀他.对于99.9999%的情况,永远不要使指针的运算符重载.

First problem is that you are trying to do this operator for pointer. If my coworker would do this I would probably try to strangle him. For 99.9999% of cases never overload operators for pointers.

如果您坚持要这样做,我猜您使用此运算符的代码看起来像这样:

If you insist on doing that I guessing that you code with usage of this operator looks like this:

Card *uninitializedPointer;
someDataStream >> uninitializedPointer; // SEGFAULT

这是错误的,因为uninitializedPointer是..它的名字说明了问题所在,您指的是受限或随机的内存块.
可能是您想要的(这是错误的,但可以使用,我在此显示的只是为了说明崩溃而不是解决问题的方法):

And this is wrong since uninitializedPointer is .. its name says what is the problem, you are referring to restricted or random chunk of memory.
Probably you want (this is wrong to but it will work, I'm showing this only to explain crash not as a fix):

Card *initializedPointer = new Card;
someDataStream >> initializedPointer;

或者:

Card object;
someDataStream >> &object;

请勿尝试通过操作符中的do分配来解决此问题,否则您将在地狱里炸:) 只是垃圾操作符重载了指针,而您真的不需要它们.

Do not try fix this by do allocation in operator or you will fry in hell :) Simply trash operators overloaded for pointers you really don't need them.

这篇关于Qt-具有重载运算符&lt;&lt;的QDataStream用于对象指针(类*)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆