2


1

const vector <pointers>をメソッドに渡すが、指す値を変更する

私は次のコードを持っています(簡潔にするために関連する部分のみを示しています - 短すぎた場合はお知らせください):

class my_class
{
    public:
    my_class() {m_i=0;}
    set(int i) {m_i = i;}
    private:
    int m_i;
}

void CallMod()
{
    // create a bunch of my_class* o = new my_class() and store in vector
    // vObject (left out for brevity)
    Mod(vObject);
    // will vObject contain pointers to objects that have m_i == 2
}

void Mod(vector const & vObject)
{
    BOOST_FOREACH(my_class o, vObject)
    {
        o->set(2);
    }
}

これは、vObjectがconstである間、Modが返されるとo→ set(2)の呼び出しによって行われた変更が保持されることを意味しますか? それは、「const」修飾子がvObjectに対する変更操作を許可しないことを示していますか(つまり、 ベクトル)が、my_classへの含まれるポインターの変更を許可しますか?

私はこれを理解しましたか? これに答える重複する質問-私はそれを見つけることができませんでした-最も高く評価されたリンク。

4 Answer


3


あなたの評価は正しいです。 vObjectのメンバーを変更したり、vObjectの非constメンバー関数を呼び出したりすることはできませんが、ベクター内のポインターのmy_classのメンバーを変更して非constメンバー関数を呼び出すことはできます。


3


ベクトルはconstになります。 const_iteratorsのみを取得できます。 変更することはできません。または要素です。

コンテナ内の要素はconstポインターになります。 残念ながら、constポインターは、ポインターの値が変更できないというだけで、それが指す要素がconstであることを意味しません。

vector`の代わりに vector`がある場合、constベクトル内のmy_classオブジェクトを変更することはできません(const-nessをキャストした場合を除きます)。


1


Mod()関数でベクトルvObjectを変更(挿入/削除)できないことを意味します。 また、Mod()関数内でmy_classへのポインターを変更できないことも意味します。 ただし、これらのポインターが指しているものは何でも変更できます。 constポインターとconstポインターが指す要素を変更する規則もここに適用されます。


0


まず、constとポインターを考えて、これが動作である理由を理解します。 基本的なポインターのさまざまな可能性を次に示します。 (2つの動的に割り当てられたchar配列: char * hello`と char * goodbye`が同等の名前の文字列に初期化されていると仮定します。)

constは何もありません:

char* ptr = hello;
ptr[0] = 'j';  // Legal
ptr = goodbye; // Legal

constへのポインター:

const char* ptr = hello;
ptr[0] = 'j';  // ILLEGAL - individual characters are const
ptr = goodbye; // Legal

定数ポインタ:

char* const ptr = hello;
ptr[0] = 'j';  // Legal
ptr = goodbye; // ILLEGAL - ptr itself is const

constへのconstポインター:

const char* const ptr = hello;
ptr[0] = 'j';  // ILLEGAL - individual characters are const
ptr = goodbye; // ILLEGAL - ptr itself is const

const_iteratorを逆参照すると、保存されたオブジェクトへのconst参照が返されます。 反復子が指すオブジェクトは my_class *`であるため、結果はconstポインター(つまり、 `my_class * const)になります。 上記のように、constポインターを再割り当てすることはできませんが、それが指すオブジェクトで非constメソッドを呼び出すことはできます。 それが「ベクター」である場合、非constイテレーターを使用しても、基礎となるオブジェクトを変更することはできません。