使用指针进行流操作符重载

时间:2014-09-02 14:36:52

标签: c++ qt operators

我正在使用QSettings存储指向自定义类的指针列表,但是当我尝试从QSettings读回时,我收到了一个memroy错误。我做了以下事情:

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

      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*>>();

读取值时出现内存错误。我的猜测是重载运算符存在一些问题。任何人都可以给我一个我做错的线索吗?

1 个答案:

答案 0 :(得分:2)

让我解释一下。

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

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

您可能无法通过指针/引用存储/加载对象。始终只存储/加载按值复制对象!尝试将您的操作转换为按值复制的对象,然后存储/加载那种类型的对象。