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> 

データの代入演算子を常に定義する必要があると思います(デフォルトまたは独自のもの)。

あなたが提案するように、このようにポインタを使用してみてください

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

これはQt、COW のためにコンテナーでは機能しませんが、(コンテナーをコピーしようとするまでは) 問題ありません。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 に答える