c++ - 集合中的不可变对象(immutable对象)(C++ 和 Qt)

标签 c++ qt operator-overloading constants immutability

我一直坚持在集合中使用不可变对象(immutable对象)。假设我有以下类(class):

 //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

现在定义一个赋值运算符似乎没有意义,因为它的原型(prototype)是

 Data& operator=(const Data&);

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

最佳答案

如果您像这样实例化 map

QMap <MyKey, Data> 

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

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

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

如果你看一下 QMap 代码 http://code.woboq.org/kde/include/QtCore/qmap.h.html ,一些运算符/成员返回,因此需要定义赋值。

关于c++ - 集合中的不可变对象(immutable对象)(C++ 和 Qt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12495226/

相关文章:

Qt 上的 C++ : Controlling transparency of Labels and Buttons

c++ - 如何声明运算符/重载函数以对 const 变量和非常量变量进行操作?

c++ - 如何为迭代器类型实现 operator->?

c++ - Accelerated C++ exercise 8-5 解不清楚

c++ - 如何在汇编中传递参数?

c++ - 使用 C++ 替换字符串文字中的几个字符

C++ Setprecision 返回错误

c++ - 如何覆盖 QWizard 中的 "next"插槽?

c++ - QT将参数传递给QDialog要求

c++ - Operator = function 和 add 函数似乎不能共存