2015-10-21 21 views
23

引数としてconst参照を受け付ける関数を持っています。それは引数を変更するべきではありませんが、それは行います(変数 "_isVertex")。どのようにこれを修正することができますか?コードは次のとおりです。関数の変更constオブジェクト

#include <vector> 
#include <iostream> 

using namespace std; 

class Element 
{ 
public: 
    bool isVertex() const 
    { return _isVertex; }; 

private: 
    bool _isVertex = true; 
}; 

class ElementContainer : public vector <Element> 
{ 
public: 
    void push(const Element &t) 
    { 
     // here everything is fine 
     cerr << t.isVertex() << ' '; 
     push_back(t); 
     // and here _isVertex is false, should be true! 
     cerr << t.isVertex() << '\n'; 
    } 
}; 

int main() 
{ 
    ElementContainer vertex; 

    vertex.push({}); 
    vertex.push(vertex[0]); 
} 
+0

プラス1つ:あなたは私を持っています。 C++の標準ライブラリコンテナは基本クラスではないことに注意してください。 – Bathsheba

+0

関数宣言の最後の 'const'は、関数の呼び出しの結果としてクラスの状態が変化しないことを保証します。返される値はconstではなく、事実の後で変更することができます。 –

答えて

32

慎重にvertex.push(vertex[0]);を考えてください。関数pushtは、vertex[0]の定数参照です。

push_backの後には、(メモリの再割り当てにより)ベクトルの内容が移動したため、vector[0]が他の場所に移動しました。 tになりました。です。

これは、の未定義の動作です。 ブーム

+0

明らかに、新しく割り当てられたバッキングストアに 't 'がプッシュされていることに注意してください。既存のデータはコピーされ、古いバッキングストアは割り当て解除されます。 – imallett

関連する問題