在集合(C ++和Qt)不变对象(Immutable object in collections (

2019-09-22 14:57发布

我坚持使用不可变对象与集合。 让我们假设我有下面的类:

 //in .h
 class Data {
 public:
      Data(const DataObj& data);
      Data(const Data&);
      const DataObj& getDataObj() const;
 private:
      const DataObj _data; //actually several objects or simple type
 }

 inline const DataObj& Data::getDataObj() const {return _data};

 //in .c
 Data(const DataObj& data)  : _data(data){}; 
 Data(const Data& original) : _data(original._data){}

问题是,当我要使用集合,我有错误

   in member function Data&Data::operator(const Data&);
   instantiation from 'typename QMap<Key,T>::iterator QMap<Key, T>::insert(const Key&, const T&)[with Key = int, T = Data]'
   instantiation from here
   error : non-static const member 'const DataObj Data::_data', can't use default assignment operator

现在定义一个赋值操作符不似乎是有道理的,因为它的原型将是

 Data& operator=(const Data&);

我该怎么办? 难道我不得不删除,以便使用中收集我的课都保持不变预选赛? 或者使用指针?

Answer 1:

使用良好的stl容器,而不是坏Qt

这将无法一起工作Qt由于COW容器,但OK(直到您尝试复制容器)与stl

class C
{
    C operator=(const C&);
};

int main()
{
    std::map<int, C> cc;
    cc.insert(std::make_pair(0, C()));
}


Answer 2:

如果你化地图像这样

QMap <MyKey, Data> 

我想你应该总是定义数据赋值运算符(默认或你自己的)。

你应该尝试使用指针,正如你提到的,像这样的

QMap <Mykey, Data*> 
QMap <Mykey, QSharedPointer<Data>> 

如果你看一看到QMAP代码http://code.woboq.org/kde/include/QtCore/qmap.h.html ,一些运营商/成员返回<T>,所以就需要分配定义。



Answer 3:

您可以使数据成员的非const的,但仅提供了类的用户访问常量,除了赋值运算符:

class Data {
 public:
      Data(const DataObj& data);
      Data(const Data&);
      Data& operator=(const Data&);
      const DataObj& getDataObj() const;
 private:
      DataObj _data;
 };

通过这种方式,分配是可变异现有对象的唯一操作。 然后,您就必须确保你提供任何公共接口访问该类型的常量实例。



文章来源: Immutable object in collections (C++ and Qt)