2009-02-26 11 views

cevap

7

Bu "değiştirilebilen" anahtar sözcükle olur.

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

Bu tamsayılar için çalışır, ancak bir liste veya bir harita için yineleyici ise, const nesneleri üzerinde çalışmaz. Bu, "=" operatörünün mevcut olmadığını söyleyen iter = list.begin() 'de hatayı atar. –

+0

@tmpforspam: Aldığınız tam hata mesajını göremeden, "liste" de aynı şekilde bir const var ve bir const_iterator kullanıyor olmalısınız. –

3

Kesilebilir değil, uçucu olduğunu bildirin.

5

Üye olarak yineleyiciye ihtiyacınız olduğundan emin misiniz? Yineleyiciler bir yeteneğe sahiptir: geçersiz olurlar. Bir tasarım probleminin küçük bir işareti.

+0

Üye işlevlerini kullanarak bir listeyi yinelemek istiyorum. getFirst ve getNext tür .... Ama bunun için bir değiştirilebilen iterator ilan etmek istiyorum bu yüzden const nesneleri üzerinde yineleyebilirsiniz. –

+1

STL-Yineleyici Tasarımı için gidin. C++ birlikteliğinde kabul edilir ve diğer geliştiricileri de şaşırtmaz. Bu, yineleyicinin sınıfın bir parçası olmadığı anlamına gelir. –

+0

@tmpforspam: Üye işlevinizi çağırırken, nesnenizin davranışı değişirse, bu bir const işlevi değildir. – xtofl

-1

Anladım.

const_iterator ile birlikte çalışır. Beni değişken ve uçucu olduğunu hatırlattığın için sağol. Değişken ile karışmış uçuculuğum var. Tekrar teşekkürler!

+0

Bu, ciddi bir sözleşme ihlalidir: 'getNextItr()' işlevini çağırdıktan sonra, istemci kodu nesnenin hala aynı olduğunu varsayacaktır, ancak öyle değil. – xtofl