2009-02-26 12 views

答えて

7

これは、「可変」キーワードを使用した場合に発生します。

class X 
{ 
public: 
    bool GetFlag() const 
    { 
     m_accessCount++; 
     return m_flag; 
    } 
private: 
    bool m_flag; 
    mutable int m_accessCount; 
}; 
+0

これは整数でも動作しますが、リストやマップのイテレータであれば、constオブジェクトでは機能しません。 iter = list.begin()に "="演算子がありませんとエラーがスローされます。 –

+0

@tmpforspam:あなたが得ている完全なエラーメッセージを見ることができないと、 "list"もconstで、あなたがconst_iteratorを使用しているように思えます。 –

3

揮発性ではなく可変であることを宣言します。

5

メンバーとしてイテレータが必要ですか?イテレータには能力があります:イテレータは無効になります。これは設計問題の小さな兆候です。

+0

メンバー関数を使用してリストを反復したいとします。 getFirstとgetNextのようなものですが、そのために私は可変反復子を宣言したいので、constオブジェクトを反復処理することができます。 –

+1

イテレータのSTL-設計に進んでください。それはC++コミュニティで受け入れられ、他の開発者を驚かせることはありません。つまり、イテレータはクラスの一部ではありません。 –

+0

@tmpforspam:メンバ関数の呼び出し時にオブジェクトの動作が変更された場合、const関数ではありません。 – xtofl

-1

using namespace std; 
class tmptest 
{ 
    public: 
    void getNextItr()const 
    { 
     m_listItr = m_list.begin(); 
     m_listItr++; 
    } 
    list<string> m_list; 
    mutable list<string>::const_iterator m_listItr; 
}; 

const_iteratorと一緒に変更できます。 mutableとvolatileを思い出させてくれてありがとう。 私は揮発性が混乱して混乱してしまった。再度、感謝します!

+0

これは深刻な契約違反です: 'getNextItr()'関数を呼び出した後、クライアントコードはオブジェクトがまだ同じであると仮定しますが、そうではありません。 – xtofl

関連する問題