- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为抽象类重载<<运算符作为虚拟运算符,我知道如何为简单类重载运算符,下面的代码是一个示例。
class NormalClass
{
public:
int firstField() const;
void setFirstField(int firstField);
int secondField() const;
void setSecondField(int secondField);
private:
int m_firstField;
int m_secondField;
};
QDataStream &operator<<(QDataStream &out, const NormalClass &obj)
{
out << obj.firstField();
out << obj.secondField();
return out;
}
但现在假设我们有如下所示的 AbstractBaseClass 和 ChildClass
class AbstractBaseClass
{
public:
AbstractBaseClass() {}
int BaseFirstField() const;
void setBaseFirstField(int BaseFirstField);
int BaseSecondField() const;
void setBaseSecondField(int BaseSecondField);
private :
int m_BaseFirstField;
int m_BaseSecondField;
};
class ChildClass : public AbstractBaseClass
{
public:
ChildClass() {}
int ChildFirstField() const;
void setChildFirstField(int ChildFirstField);
private:
int m_ChildFirstField;
}
现在我想为 AbstractBaseClass 重载 << 运算符,子类应该实现它。
这是我的尝试
#ifndef ABSTRACTBASECLASS_H
#define ABSTRACTBASECLASS_H
#include <QDataStream>
class AbstractBaseClass
{
public:
AbstractBaseClass();
int BaseFirstField() const;
void setBaseFirstField(int BaseFirstField);
int BaseSecondField() const;
void setBaseSecondField(int BaseSecondField);
private :
int m_BaseFirstField;
int m_BaseSecondField;
};
virtual QDataStream &operator<<(QDataStream &out, const AbstractBaseClass &obj)=0;
#endif // ABSTRACTBASECLASS_H
编译器报错:virtual outside class declaration,你知道吗?
最佳答案
我试过编译成功了,你觉得这个方法怎么样,有没有更好的效果。
这是抽象类
.h
#ifndef ABSTRACTBASECLASS_H
#define ABSTRACTBASECLASS_H
#include <QDataStream>
class AbstractBaseClass
{
public:
AbstractBaseClass();
int BaseFirstField() const;
void setBaseFirstField(int BaseFirstField);
int BaseSecondField() const;
void setBaseSecondField(int BaseSecondField);
virtual QDataStream &serialize(QDataStream &stream)=0;
private :
int m_BaseFirstField;
int m_BaseSecondField;
};
QDataStream &operator<<(QDataStream &out, AbstractBaseClass &obj);
#endif // ABSTRACTBASECLASS_H
.cpp
#include "abstractbaseclass.h"
AbstractBaseClass::AbstractBaseClass()
{
m_BaseFirstField = 0;
m_BaseSecondField = 0;
}
int AbstractBaseClass::BaseFirstField() const
{
return m_BaseFirstField;
}
void AbstractBaseClass::setBaseFirstField(int BaseFirstField)
{
m_BaseFirstField = BaseFirstField;
}
int AbstractBaseClass::BaseSecondField() const
{
return m_BaseSecondField;
}
void AbstractBaseClass::setBaseSecondField(int BaseSecondField)
{
m_BaseSecondField = BaseSecondField;
}
QDataStream &operator<<(QDataStream &out, AbstractBaseClass &obj)
{
return obj.serialize(out);
}
和子类
class ChildClass : public AbstractBaseClass
{
public:
ChildClass(){}
int ChildFirstField() const
{
return m_ChildFirstField;
}
void setChildFirstField(int ChildFirstField)
{
m_ChildFirstField = ChildFirstField;
}
private:
int m_ChildFirstField;
// AbstractBaseClass interface
public:
QDataStream &serialize(QDataStream &stream) override
{
stream << BaseFirstField();
stream << BaseSecondField();
stream << ChildFirstField();
return stream;
}
};
关于c++ - QDataStream operator << 抽象类的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46211228/
我有一个相当奇怪的问题,使用 QDataStream,或者至少对我来说很奇怪,因为我根本不理解这种行为。 当然,我的问题来自一个大项目,但我设法用一个最小的例子重现了这种奇怪的行为,我现在将对此进行描
QFile msnLogFile(item->data(Qt::UserRole).toString()); QDataStream logDataStream; if(msnLogFile
我有一个包含两个主要模块的应用程序。一个是用 C 编写的,使用标准 C 运行时库,另一个是用 Qt C++ 编写的。它们通过 IPC 相互通信。 C 模块创建一个 char 数组,用数据填充它并发送到
我正在努力学习教程 here并序列化 Qt 对象。这是我的代码: QFile file("/Users/kaustav/Desktop/boo.dat"); if (!file.open(QIODev
我想将 QVector 序列化为 char* 数组。我通过以下代码执行此操作: QVector in; ... QByteArray bytes; QDataStream stream(&bytes,
我正在尝试保存 3 QVector和一个带有 QDataStream 的整数. 我重载了 operator #include #include class CloudData { public:
我正在尝试将特征向量序列化为 QDataStream: #include "utils.h" #include "Eigen/Eigen" int main(int argc, char *argv[
我正在用 Qt 实现一个小接口(interface)。在我目前正在处理的步骤中,我有 Scores(自定义类)我可以在只能容纳一个 Score 的 Docks(同样是自定义类)上移动。 我用这个例子启
假设我有一个创建 QIODevice(例如 QFile)的函数,然后返回一个指向从 QIODevice 构造的 QDataStream 的指针。在这里处理内存分配的最佳方法是什么?显然,QIODevi
我需要通过 QTcpSocket 接收二进制数据(读取浮点数)并使用 QDatastream 将它们写入 Qfile。但是我在使用 QDataStream 时遇到了一些问题。如下,我只能用这种方式来实
请考虑以下来自 QDataStream 的代码片段文档: QFile file("file.dat"); file.open(QIODevice::ReadOnly); QDataStream in(
我目前正在尝试在我的代码中实现一个序列化系统,该系统将一个类型的多个对象存储在一个文件中。这非常有效,我通常只是使用 OpenMode QIODevice::Append 将它们一一附加。这里没有问题
我想将存储在 vector (保存结构)中的数据写入文件,并从该文件读取数据。我尝试使用 QDataStream 并重载“>>”和“ &data) { for(uint8_t i=0; i >
我想为抽象类重载 class AbstractBaseClass { public: AbstractBaseClass(); int BaseFirstField() const;
我正在尝试在 QTcpSocket 上发送一个 QByteArray 。我面临的问题是,虽然我发送了一个长度为 25 的数组,但在服务器上它收到了 59 个字节。这是我的示例代码: //client
这是一个关于在 C++ 和 Linux 中使用 QDataStream 和 QTemporaryFile 的 QT 问题。 我在刷新 QDataStream 时遇到了一些问题。 QTextStream
我正在 Qt 中编写一个简单的基于 TCP 的网络应用程序并想使用 QDataStream和 QByteArray通过网络发送数据。问题是当我将数据放入 QByteArray 时他们被“归零”了。例如
我有来自 tcp 套接字的数据作为原始数据(我有指定的格式),然后基于该数据创建一个对象。格式是这样的:24 字节的 header [数据大小和一些其他信息],然后是 header 中指定的数据量。
我有一个文件,假设长度为 8 个字节。例如它看起来像这样: 22222222 现在,我先读取 5 个字节并更改它们。对于前。到 11111 最后,我想将它们写入 ONTO EXCISTING DATA
根据本网站上的各种答案,我尝试定义自己的模板函数以将任何枚举值写入 QDataStream。 template ::value>> QDataStream &operator>(enumValue);
我是一名优秀的程序员,十分优秀!