2

我坚持使用带有集合的不可变对象。假设我有以下课程:

 //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&);

我该怎么办?为了在集合中使用我的类,我是否被迫删除所有常量限定符?还是使用指针?

4

3 回答 3

2

如果您要像这样实例化您的地图

QMap <MyKey, Data> 

我想您应该始终为 Data 定义一个赋值运算符(默认或您自己的)。

您应该按照您的建议尝试使用指针,如下所示

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

如果您查看 QMap 代码http://code.woboq.org/kde/include/QtCore/qmap.h.html,一些运算符/成员返回 < T >,因此需要定义分配。

于 2012-09-19T14:13:22.380 回答
1

您可以将数据成员设为非 const,但仅向类的用户提供 const 访问权限,赋值运算符除外:

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

这样,赋值是唯一可以改变现有对象的操作。然后,您必须确保在任何公共接口中提供对这种类型的 const 实例的访问。

于 2012-09-19T13:04:42.270 回答
1

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

由于COW,这将无法与Qt容器一起使用,但是可以(直到您尝试复制容器)stl

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

int main()
{
    std::map<int, C> cc;
    cc.insert(std::make_pair(0, C()));
}
于 2012-09-19T16:48:38.283 回答