1

次のプログラムにはA、非静的関数を持つクラスがありますvoid add()add()セット内の各要素に対してイテレータを使用して呼び出したいのですが、最後の要素でエラーが発生します。

どうすれば修正できますか?

#include <iostream>
#include <set>

using namespace std;

class A
{
private:
    int a;
public:
    A(int x) { a = x; }
    void add() {a = a + 1; }
    bool operator<(A x) const { return a < x.a; }
};

int main()
{
    //type of the collection
    typedef set<A> IntSet;

    //define a IntSet type collection
    IntSet col1;
    IntSet::iterator pos;

    //insert some elements in arbitrary order
    col1.insert(A(3));
    col1.insert(A(4));
    col1.insert(A(5));

    //iterator over the collection and print all elements

    for(pos = col1.begin(); pos != col1.end(); ++pos)
    {
        (*pos).add();
        // ERROR!: Member function 'add' not viable:
        // 'this' argument has type'const value_type' 
        // (aka 'const A'), but function is not marked const
    }
    cout << endl;
}
4

1 に答える 1

4

コンテナに含まれるアイテムset<>が考慮constされ、変更することはできません。もしそうなら、彼らのアイデンティティは変わるかもしれませset<>んが、これに気付かず、アイテムが属していないバケツに保管されるため、内部構造に大混乱をもたらします!

たとえば、内容を並べ替えるためにset<>カスタムoperator<オーバーロードを使用するとします。aオブジェクトがセットに含まれているときにメンバー変数を変更するとどうなるでしょうか? セットはそれがa変更されたことを認識せず、オブジェクトを元の場所に残します。

この潜在的な問題を修正するために、含まれているオブジェクトのインスタンスset<>への参照のみが提供されます。const

constこのコンテキストではクラスのメンバーのみを使用でき、add()宣言されていませんconst。オブジェクトを変更し、それらの変更をセットに反映させたい場合は、オブジェクトのコピーを作成し、元のオブジェクトをセットから削除し、コピーに変更を加えてから、コピーをセットに追加する必要があります。 .

于 2013-04-12T16:14:46.327 に答える