c++ - 带指针的流运算符重载

标签 c++ qt operators

我正在使用 QSettings 存储指向自定义类的指针列表,但是当我尝试从 QSettings 读回时出现内存错误。我已完成以下操作:

  • 将我的自定义类声明为元类型:

      Q_DECLARE_METATYPE(QCustomAction*)
    
      Q_DECLARE_METATYPE(QList<QCustomAction*>)
    
  • 将自定义类注册为元类型及其运算符:

     qRegisterMetaType<QCustomAction*>("QCustomAction*"); 
     qRegisterMetaTypeStreamOperators<QCustomAction*>("QCustomAction*"); 
     qRegisterMetaType<QList<QCustomAction*>>("QList<QCustomAction*>");              
     qRegisterMetaTypeStreamOperators<QList<QCustomAction*>>("QList<QCustomAction*>");
    
  • 重载流运算符:

     QDataStream &operator<<(QDataStream &out, QCustomAction* const  obj)
     {
     out << obj->m_actionName << obj->m_lastIndex;
     return out;
     }
     QDataStream &operator>>(QDataStream &in, QCustomAction* obj)
     {
     in >> obj->m_actionName >> obj->m_lastIndex;
     return in;    
     }
    

之后,我的代码编译没有错误,我可以通过调用保存列表:

     myQSettings.setValue("ActionsList",QVariant::fromValue<QList<QCustomAction*>>(someList)); 

我将这些值读为:

     someList =  myQSettings.value("ActionsList").value<QList<QCustomAction*>>();

读取值时出现内存错误。我的猜测是重载运算符存在一些问题。有人可以告诉我我做错了什么吗?

最佳答案

让我解释一下。

例如:如果您保存一个 int Qt 将从您那里获取一个 int 并以某种方式将该 int 存储到磁盘(通过运算符(operator))。另一方面,在加载时,Qt 将创建一个 int,从磁盘加载其值(通过运算符)并将该 int 返回给您。

对于您的指针,Qt 将尝试以相同的方式执行此操作:Qt 将从您那里获取一个指针,并以某种方式将该指针存储到磁盘(由您的运算符(operator)访问对象)对应于该指针)。另一方面,在加载时,Qt 将创建一个未初始化的指针,并尝试从磁盘加载其值(由您的运算符(operator))并将其返回给您。然而,它需要做的是创建一个对象来初始化指针。

您不能通过指针/引用存储/加载对象。始终仅存储/加载按值复制对象!尝试将您的操作转换为按值复制对象并存储/加载那种类型的对象。

关于c++ - 带指针的流运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626017/

相关文章:

c++ - 从不同线程调用 setPos 时 QGraphicsItem 消失

c++ - 无法将大小 QMainWindow 设置为小于 200x100 像素

c++ - C++ 中 ^ 运算符的作用是什么

jquery - @ 字符在 jQuery 中起什么作用?

c++ - 我如何区分这两个运算符重载?

c++ - Libmicrohttpd 的限制是什么?

c++ - 将 QMainWindow 中的 enterPressed() 连接到 Button clicked()

c++ - 来自 C++ 中的多元正态/高斯分布的样本

c++ - 如何控制后台进程/守护进程

c++ - 如何通过编写编辑器来学习C++?