【问题标题】:how to get ostream if I have << and >> operator overloaded already [closed]如果我已经重载了 << 和 >> 运算符,如何获得 ostream [关闭]
【发布时间】:2013-12-26 08:30:58
【问题描述】:

我有一个名为 myClass 的类。它有重载运算符 >。我可以将它与 cin 和 cout 对象一起使用。现在我想将此类的对象写入 Qt 中的文件。我怎样才能得到它的缓冲区来玩。尽可能转换为 QTextStream、QDataStream 或建议我任何解决方案。 谢谢 喜欢

【问题讨论】:

  • 您可以使用不同的操作数类型对同一运算符进行多次重载。根据您编写内容的方式,它们可能需要成为友元函数而不是类成员。您还可以查看@user1781290 上面给出的链接。
  • 除了cin和cout外,我如何使用ostream和istream?
  • 例如 cout
  • 也许你想试试字符串流?但我仍然没有得到你真正想要实现的目标......

标签: c++ qt iostream


【解决方案1】:

1) 您需要将您的“类数据”转换为带有&lt;&lt; 重载的临时字符串流。

2) 你需要从你已经构造和设置的字符串流对象中查询到字符串对象。

3) 您需要从字符串对象中获取QString(或QByteArray)。

4) 您可以为QTextStreamQDataStream 类设置特定的QString

下面是用正确的 Qt 方式为您进行转换的代码:

std::stringstream myStringStream;
myStringStream << MyClassObject;
QTextStream textStream(QString::fromStdString(myStringStream.str()));

std::stringstream myStringStream;
myStringStream << MyClassObject;
QDataStream dataStream(QString::fromStdString(myStringStream.str()));

您也可以使用setString 方法而不是构造函数来正确设置QDataStream 和/或QTextStream

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这显然是对istreamQ*Stream 所代表的含义的误解。把它们想象成管道或管子。它们不保存数据,它们只允许将数据从一个地方(类对象)移动到另一个地方(文件或类似的东西)。

    换句话说,数据不存储在流本身中,因此即使您可以将istream 转换为QDataStream,它也不会以任何方式帮助您检索myClass 对象从溪流中流出。

    正如评论中所建议的,人们可以这样做:

    stringstream ss;
    QDataStream  ds;
    myclass a;
    
    ...  do other stuff with a, such as give it some content... 
    
    ss << a;
    
    string s = ss.str();
    
    ds << s;
    

    (可能需要其他步骤将 std::string 转换为适合存储在 QDataStream 中的对象,但这里的本质是您使用 std::istream 类型的对象从类中获取数据转换成字符串,然后将字符串输出到您的 QDataStream)

    【讨论】:

    • 我知道,如何从字符串转换为。问题是我如何从 获取字符串
    • 就像我说的,使用字符串流!
    • -1。没有QStream 这样的东西。请解决这个问题。
    • @LaszloPapp:不,没有一种叫做 QStream 的东西,但是 QT 中有几种流,例如 QTextStream 和 QDataStream。您希望我如何改写该语句以包含 QT 中所有可能的流?我很高兴这样做,但我看不到我对所有 QT 流 QStream 的通用名称的使用如何影响答案......
    • @Mats:无效。此外,QT != Qt。请阅读关于它的标签 wiki...
    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 2010-10-03
    • 2020-02-10
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多